关于 .NET 中对不可为空的引用类型的支持存在许多问题。最大的希望是代码合约,但它仅限于预算有限的人的运行时检查。
至于代码合同以外的方法,Jon Skeet几年前写了一篇关于此的博客文章,其中一位评论者提供了一个看起来很有用的NonNull 结构,它修改了 IL 以禁用默认构造函数。这似乎是一种极好的方法,我可以想象将其扩展为提供各种不可为空的微类型。IL 操作可以是由结构上的属性触发的构建后步骤,例如
//Microtype representing a non-zero age, so we want to disable the default ctor
[NoDefaultConstructor]
public struct Age
{
public Age(int age)
{
// Implementation (including validation) elided
}
}
在我进一步调查之前,我想问一下是否有人知道这可能导致的任何问题?我一个都想不出来。