我正在看这篇文章,并且正在努力遵循解释提升运算符的VB.NET示例.似乎没有相应的C#示例或教程.我一般都没有太多关于运算符重载的经验,因此在阅读可空类型的同时尝试使用VB.NET等价物可能不是最好的开始...
是否有人能够解释提升的运算符以及它们如何被可空类型使用?它只是意味着可空类型本身不会重载运算符,并将使用它所代表的基础类型的运算符吗?
关于提升的运营商似乎没有太多关于SO的信息,所以希望这也可以帮助其他人.
我今天早些时候发生的事情让我摸不着头脑.
Nullable<T>可以为任何类型的变量赋值null.例如:
int? i = null;
起初,我看不出如何做到这一点是可能的,而不以某种方式从定义的隐式转换object到Nullable<T>:
public static implicit operator Nullable<T>(object box);
但是上面的运算符显然不存在,就好像它确实如此,那么下面的内容也必须是合法的,至少在编译时(它不是):
int? i = new object();
然后我意识到,也许Nullable<T>类型可以定义一个隐式转换为一些永远无法实例化的任意引用类型,如下所示:
public abstract class DummyBox
{
    private DummyBox()
    { }
}
public struct Nullable<T> where T : struct
{
    public static implicit operator Nullable<T>(DummyBox box)
    {
        if (box == null)
        {
            return new Nullable<T>();
        }
        // This should never be possible, as a DummyBox cannot be instantiated.
        throw new InvalidCastException();
    }
} …我在 C# 中有一个结构类型。我希望能够null隐式转换为这种类型。例如,null可以由结构类型的特殊值表示,并且强制转换运算符应返回具有此值的结构。
在 C++ 中,我可以使用 type 的隐式强制转换运算符重载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 …