es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el uso de [var x = new T()] se resuelve como [T?]?

Estoy utilizando VS2022, .NET 6, C# 10, con el contexto de nulabilidad habilitado en todo el proyecto.

public static ModelEnumerationAttributeProperty FromPropertyInfo(PropertyInfo propertyInfo, object value)
{
    var property = ModelEnumerationAttributeProperty.FromPropertyInfo(propertyInfo);

    property.PropertyValue = value;
    property.PropertyValueString = value?.ToString();

    return (property);
}

El tipo auto-detectado de la variable property se resuelve como el tipo nullable ModelEnumerationAttributeProperty?.

Parece ser una simple llamada de constructor a una clase convencional. Los constructores pueden lanzar excepciones, pero no pueden devolver un valor nulo.

Imagen

Entonces, ¿por qué el uso de [var x = new T()] se resuelve automáticamente como <t?>?

ACTUALIZACIÓN: Aquí está la sobrecarga estática que llama a un constructor:

public static ModelEnumerationAttributeProperty FromPropertyInfo(PropertyInfo propertyInfo)
{
    var property = new ModelEnumerationAttributeProperty();

    property.PropertyInfo = propertyInfo;
    property.Type = propertyInfo.PropertyType;
    property.Name = propertyInfo.PropertyType.Name;
    property.FullName = propertyInfo.PropertyType.FullName ?? "";
    property.AssemblyQualifiedName = propertyInfo.PropertyType.AssemblyQualifiedName ?? "";

    property.PropertyName = propertyInfo.Name;

    return (property);
}

El compilador no marca esta sobrecarga y el tipo de retorno es no nulo. Podría haber llamado a var o = new object(); y haría lo mismo.</t?>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El uso de la palabra clave var en C# inferirá el tipo de la variable en función del valor asignado a ella. En el fragmento de código dado, el tipo inferido de la variable property es ModelEnumerationAttributeProperty? porque el _context está habilitado para la nulabilidad en todo el proyecto. Esto significa que todos los tipos de referencia son nulos de forma predeterminada a menos que se marquen explícitamente como no nulos utilizando el operador !. Dado que ModelEnumerationAttributeProperty es un tipo de referencia y no está marcado con el operador !, su tipo se infiere como ModelEnumerationAttributeProperty?.

    Sin embargo, en el fragmento de código actualizado, la sobrecarga del constructor devuelve un ModelEnumerationAttributeProperty no nulo y, por lo tanto, se infiere que el tipo de la variable property es no nulo.

    Es importante tener en cuenta que estas anotaciones de nulabilidad solo se hacen cumplir por el compilador y no en tiempo de ejecución. Esto significa que incluso si se asigna un valor no nulo a una variable con tipo nulo, el compilador seguirá advirtiendo sobre posibles excepciones de referencia nula.

Comments are closed.