我可以在C#中重载“cast from null”运算符吗?

时间:2015-07-16 13:01:12

标签: c# struct null

我在C#中有一个结构类型。我希望能够隐式地将null转换为此类型。例如,null可以用结构类型的特殊值表示,而强制转换操作符应该返回一个具有该值的结构。

在C ++中,我可以使用std::nullptr_t类型的隐式转换运算符重载。 C#中有类似的类型吗?

我有想法使用没有实例的特殊NullType类。这有效,但看起来有些难看。还有更好的方法吗?

示例:

class NullType
{
    private NullType(){} // ensures that no instance will ever be created
}

struct X
{
    private static readonly int nullValue = -1;
    private int val;

    public X(int val){ this.val= val; }

    public static implicit operator X(NullType t)
    { 
        return new X(nullValue);
    }
}

class MainClass
{
     public static void Main(string[] args)
     {
          X x = null; // Works now!
     }
}

1 个答案:

答案 0 :(得分:1)

不,转换运算符只允许从类型转换,而不是从类型的特定值转换,即RUN wget -qO- https://get.docker.com/ubuntu/ | sed -r 's/^apt-get install -y lxc-docker$/apt-get install -y lxc-docker-1.6.2/g' | sh ,因此没有null转换运算符。

没有引入自己的类型的最佳拟合运算符将是:

null

但显然你不想使用它。使用它是不安全的(public static implicit operator X(object t) 可以是任何值,并且是处理异常中非空案例的唯一方法。)

那就是说,我认为你现在创造它的方式,使用一个无法初始化的类是最好的方法。事实上,唯一的问题是:为什么要使用t,而不是仅仅使用'结构上的默认值实例(null)。