如何在.net中引入可空类型?

Gor*_*son 20 .net c# nullable

在我们自己的Jon Skeet的C#中,他讨论了模拟值类型的'null'的3种方法:

  • 魔术值(例如最早可能的DateTime被视为'null')
  • 引用类型包装器
  • 布尔标志

提到可空类型使用第三种方法.可空类型究竟如何在引擎盖下工作?

Mar*_*ell 35

最终,它们只是一个带有bool标志的通用结构 - 除了特殊的拳击规则.因为结构体(默认情况下)初始化为零,所以bool默认为false(无值):

public struct Nullable<T> where T : struct {
    private readonly T value;
    private readonly bool hasValue;
    public Nullable(T value) {
        this.value = value;
        hasValue = true;
    }
    public T Value {
        get {
           if(!hasValue) throw some exception ;-p
           return value;
        }
    }
    public T GetValueOrDefault() { return value; }
    public bool HasValue {get {return hasValue;}}
    public static explicit operator T(Nullable<T> value) {
        return value.Value; }
    public static implicit operator Nullable<T>(T value) {
        return new Nullable<T>(value); }
}
Run Code Online (Sandbox Code Playgroud)

但是,差异很大:

  • 特殊拳击规则(你通常不能这样做)
  • 用于比较null等的特殊C#规则
  • "解除"(以及在.NET通过在C#运营商EqualityComparer<T>,Comparer<T>等等)
  • 关于泛型类型约束的特殊规则(防止Nullable<Nullable<T>>)

  • 它由 CLI 中的特殊规则处理。不,您*不能*自己这样做。同样,“提升”运算符不是您自己可以做的。 (2认同)