¿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.
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?>
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 variableproperty
esModelEnumerationAttributeProperty?
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 queModelEnumerationAttributeProperty
es un tipo de referencia y no está marcado con el operador!
, su tipo se infiere comoModelEnumerationAttributeProperty?
.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 variableproperty
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.