我已经从这个线程中知道,在.NET 7中,即使将Nullable
设置为“Enabled”,隐式声明的引用类型也是可空的,我甚至知道为什么。
我不是在问为什么。我在询问一种解决方法。
在评论中,@shingo指出了一个简单示例的解决方法,因此在这里我将列出带我来到这里的问题:LINQ查询的结果。下面的变量nonEmpty
实际上是可空的。
var nonEmpty = myList.Where(s => s.Length > 0).ToList();
nonEmpty = null; // again valid when it should not be
要使它非空,我必须明确声明类型。
List<string> nonEmpty = myList.Where(s => s.Length > 0).ToList();
nonEmpty = null; // compiler warning/error as desired.
对于像List<string>
这样的短命名类型,这不是问题。但当名称像我的代码中那样非常长时,就会出现问题。
所以我的问题是:
是否有任何简写方法可以让我避免在此处声明类型?或者甚至是未来的语言提案中有这样的技巧吗?
实际上,我尝试了以下3个声明,但都没有成功。只有第三个编译通过。
var! nonEmpty = myList.Where(s => s.Length > 0).ToList();
var nonEmpty! = myList.Where(s => s.Length > 0).ToList();
var nonEmpty = myList.Where(s => s.Length > 0).ToList()!
var
隐式为空,但静态分析将在整个方法中将其视为非空,因此除非重新将变量分配为null
,否则不会影响可空性分析--如果确实这样做了,它会再次发出警告。您当前唯一没有获得的是如果您分配null
,则没有明确的警告,尽管这可能被视为缺点,但我认为真正的问题在于根本不应该重新分配本地变量,因为值是次要的。 - Jeroen MostertnonEmpty = null
,那么如果随后尝试以需要其不是null
的方式使用nonEmpty
,他们 将收到警告。赋值不会发出警告,但赋值并不是引起问题的原因——可能访问null
引用才是,而分析仍然会发出警告。或者从哲学上说,如果分配了一个从未被读取的null
,它会发出声音吗?实际上不会。 - Jeroen Mostert