为什么数组元素似乎逃脱了空检查?

gio*_*ida 5 c#

显然不可空是新的默认值,所以我选择了它。考虑下面的代码:

public class C { }
        
public static C f()
{
    return null;
}
Run Code Online (Sandbox Code Playgroud)

编译器会警告可能返回空引用。但如果我改写:

public static C f()
{
    C[] a = new C[10];
    return a[0]; // null
}
Run Code Online (Sandbox Code Playgroud)

然后编译器保持沉默。我检查了一下返回的值实际上是null. 这只是推理机的弱点吗?

Jon*_*eet 7

您的数组被声明为类型C[]而不是C?[]- 因此编译器希望您知道自己在做什么,并将填充元素,使它们不为空。它没有考虑到默认元素值为null。在读取任何值之前检测代码以完全填充数组将是极其困难或不可行的。

你是否认为这是“推理机的弱点”更多的是见仁见智的问题。但基本上你应该小心数组。