【发布时间】:2022-02-08 17:34:21
【问题描述】:
我想我在某个地方看到过这个问题的答案,但我找不到它,也不记得答案了。
假设 Nullable-Reference-Types 已启用。
有一个方法返回string。该方法的调用者将结果字符串存储到一个变量中。变量将为 Nullable,即使方法的返回值不可为空。
static string MyMethod()
{
return "Hello World!";
}
public static void Main()
{
// result is of type string? here. Hence nullable.
var result = MyMethod();
}
原始类型似乎不会发生同样的情况,但引用类型确实会发生这种情况,例如object。有点违背了 NRT 对我的目的。我敢肯定这是有原因的,而且是“设计使然”。
【问题讨论】:
-
无法复制。我可以打印出
result.Length和result2.Length而没有任何警告。 -
您如何观察到该变量现在可以为空?也许您在分析和观察这种行为时/无论做什么都存在问题?
-
result将是string?,因为使用了var(这是设计使然,根据 Matthew 的回答),但result2肯定不会——它是string,就像你指定的那样。result2 = null不会编译。请注意,尽管有隐式类型,但静态分析会发现result在调用MyMethod后实际上并不是null,因此涉及它的表达式不会触发警告。在所有情况下,NRT 仅存在于语言级别,而不是运行时级别,因此底层 reference 始终可以保存null(强制通过result2 = null!)。这也是一种设计选择。 -
是的,
result2绝对不能为空。我会在我的回答中提到这一点,以使其明确。 -
@JeroenMostert 你是对的
result2。它不能为空。可能是静态分析的一个奇怪的挂断......或者只是我。
标签: c# nullable-reference-types