【发布时间】:2020-10-07 04:10:57
【问题描述】:
我正在尝试在 C# 8.0 中使用可空引用类型。我已经设置了一个示例代码来测试它,但有些事情让我感到困惑!
据我了解,当我们不将? 添加到Type 时,它被视为不可为空。那么为什么在 Main() 方法中编译器没有抱怨我正在检查 myClass 和 null?在这一点上,编译器不应该很明显myClass 不可为空吗?
更新:
我向 MyClass 添加了一个存根方法。如您所见,此时编译器知道 myClass 不为空。为什么它允许下一次空值检查?这没有意义!
#nullable enable
using System;
namespace ConsoleApp4
{
class Program
{
static void Main()
{
var service = new Service();
MyClass myClass = service.GetMyClass();
myClass.Write();
// I am curious why this line compiles!
if (myClass == null)
{
throw new ArgumentNullException();
}
}
}
public sealed class Service
{
private MyClass? _obj;
public MyClass GetMyClass()
{
if (_obj == null)
{
_obj = new MyClass();
}
return _obj;
}
}
public sealed class MyClass
{
public void Write()
{
}
}
}
【问题讨论】:
-
MyClass是一个class,因此是一个引用类型。无论是否使用?运算符声明,它仍然可以为空。 -
@BarryO'Kane C# 8 引入了可为空的引用类型,事情做了一些改变。 OP 用特定版本明确标记了问题
-
无法分配
null值,但我很难在规范中找到无法比较 带有null值。 -
@BarryO'Kane 请参阅:Nullable reference types
-
@cassandrad:请参阅 OP 代码顶部的第一条指令行。
标签: c# nullable c#-8.0 non-nullable