【问题标题】:Why is the use of [var x = new T()] resolving to [T?]?为什么使用 [var x = new T()] 解析为 [T?]?
【发布时间】:2022-01-15 18:36:15
【问题描述】:

我正在使用 VS2022、.NET 6、C# 10,并在项目范围内启用了可空性上下文。

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

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

    return (property);
}

变量property 的自动检测类型解析为可空类型ModelEnumerationAttributeProperty?

这似乎是对 vanilla 类的简单构造函数调用。构造函数可以抛出异常但不能返回 null。

那么为什么使用 [var x = new T()] 会自动解析为

更新:* 这是调用构造函数的静态重载:

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);
}

如果不可为空,编译器不会标记此重载和返回类型。我还不如打电话给var o = new object();,它会做同样的事情。

【问题讨论】:

  • 虽然不是构造函数调用,而是静态方法调用。
  • 我在您的代码中没有看到任何new T()ModelEnumerationAttributeProperty.FromPropertyInfo 方法的返回类型很可能是 T?
  • 看起来你正在调用一个不同的 FromPropertyInfo 重载,它只需要 PropertyInfo。能否也包含该方法的代码?
  • 编辑问题以添加相关代码。

标签: c# visual-studio-2012 nullable .net-6.0 c#-10.0


【解决方案1】:

这是由语言定义的。

来自the documentation for var

重要

当 var 与启用的可空引用类型一起使用时,它始终暗示可空引用类型,即使表达式类型不是 可以为空。编译器的空状态分析可防止 取消引用潜在的空值。如果变量从不 分配给一个可能为空的表达式,编译器不会发出任何 警告。如果将变量分配给可能是 null,您必须在取消引用它之前测试它不为 null 避免任何警告。

【讨论】:

  • 谢谢。我无法与文档争论,但它确实让我想知道为什么 var o = new object(); 应该解析为 object? 作为设计选择。我确信现在有一个原因让我无法理解。在那之前,在使用var 时,这种选择似乎会通过不必要的可空性防御来传播代码库。
  • @RaheelKhan 这里有一些讨论:github.com/dotnet/roslyn/issues/53078
猜你喜欢
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多