上下文
C# 8.0 具有 non-nullable reference types 的这个特性.
string notNull = "Hello";
string? nullable = default;
notNull = nullable!; // null forgiveness
问题
不始终在 *.csproj 文件中启用不可为空性的原因是什么?
你有 list 吗?比如,“不要 <Nullable>enable</Nullable>
如果...a)...b)...c)...”?
我能想到的
我能想到的唯一原因是与现有代码的向后兼容性。意思是:启用该功能并修复所有编译器错误和调整代码可能太耗时,因此成本高昂;也许也容易出错。
我用谷歌搜索但没有找到任何其他原因:when not to use non-nullable refernce types in c# - Google Search
文档
- Microsoft 文档 → Nullable reference types
- 这篇博客文章提供了大量说明性代码示例:Containing Null with C# 8 Nullable References, Frank A. Krueger
附言
请告诉我 Stack Overflow 是否是提出此问题的错误地点,以及哪个其他 Stack Exchange 网站更适合。
我认为 Stack Exchange 可能是正确的位置,因为 What topics can I ask about here?
- “软件开发所特有的实际的、可回答的问题”
最佳答案
这是因为语义空检查器没有(也不能)涵盖所有条件来断言变量已从非空值分配,并且需要许多额外的标记来帮助空检查器,如系列的属性,甚至不足以使一切看起来都正常。
这是一个不完整的列表:
当一个方法的返回值依赖于参数复杂且无法用
NotNullWhen
系列属性描述时,它应该被标记为可空的,即使它可以被断言不为空。null检查器只能将一个类的构造函数作为唯一的初始化时机,这意味着一些对象(反序列化实体、虚拟actor、razor组件等)的生命周期由一个库拥有和管理/框架应声明为所有字段都标记为可为空,即使假设某些库定义的初始化方法(分配所有必需的非可空值)在任何其他方法之前被调用。
当流检查器无法断言局部变量的可为空状态时,该局部变量被推断为始终可以为空,使用
var
关键字,或者从某些代码返回的值不或者不能准确标记可空性,在使用前强制执行空检查或!
将其视为可空,即使程序员清楚地知道它不能为空。
是的,您可以在任何地方使用 !
或 [AllowNull]
系列来禁用空检查器,但为什么不禁用整个空检查机制呢?因此,可空特性将毫无意义。
可空引用类型特性只适用于逻辑非常基础或琐碎的项目。只要花费大于帮助,不启用它就是合理的。
关于c#-8.0 - 有什么理由不总是使用 C# 8.0 的不可空引用类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63092024/