繁体   English   中英

"Non-Nullable 在返回时变为 Nullable"

[英]Non-Nullable becomes Nullable on return

我想我在某个地方看到过这个问题的答案,但我找不到它,也不记得答案了。

假设 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();

   // result2 is also nullable here.
   string result2 = MyMethod();
}

原始类型似乎不会发生同样的情况,但它确实会发生引用类型,例如object 有点违背了 NRT 对我的目的。 我敢肯定这是有原因的,而且是“设计使然”。

这确实是设计使然。

选择此设计的会议记录在这里: https<\/a> :\/\/github.com\/dotnet\/cshaplang\/blob\/main\/meetings\/2019\/LDM-2019-12-18.md#var

总结一下:人们经常不得不显式地键入变量而不是使用var<\/code> ,因为在从非空返回方法进行赋值之后,代码继续将null<\/code>赋给变量。

引用会议记录:

在这一点上,我们已经看到大量代码需要人们拼出类型而不是使用 var,因为代码稍后可能会分配 null。

也就是说,发现如下代码非常频繁:

请注意(正如 Jeroen Mostert 所指出的)您的问题中的result2<\/code>不可为空,因为它被明确键入为不可为空。 我不确定您为什么认为它可以为<\/em>空,但绝对不是。

例如,查看 DotNetFiddle 上的这个 repro<\/a>并注意第 11 行的警告。

在 C# 8.0 中,字符串被称为可以为空的“字符串!”,因此 Allow Null 注释允许将其设置为 null,即使我们返回的字符串不是 null(例如,我们进行比较检查并将其设置为如果为 null,则为默认值。)

"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM