我可以超载吗;“从零开始强制转换”;C#中的运算符?

我可以超载吗;“从零开始强制转换”;C#中的运算符?,c#,struct,null,C#,Struct,Null,我在C#中有一个结构类型。我希望能够将null隐式转换为此类型。例如,null可以由struct类型的特殊值表示,cast操作符应该返回一个具有此值的struct 在C++中,我可以使用类型隐式施放运算符重载:STD::nulpprtt。C#中有类似的类型吗 我想到了使用一个特殊的NullType类,它没有实例。这很管用,但看起来有点难看。有更好的办法吗 例如: class NullType { private NullType(){} // ensures that no instan

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

<>在C++中,我可以使用类型<代码>隐式施放运算符重载:STD::nulpprtt。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!
     }
}

不,转换运算符只允许从类型转换,而不允许从类型的特定值转换,即
null
,因此不存在
null
转换运算符

不引入自己类型的最佳拟合运算符如下:

public static implicit operator X(object t)
但显然你不想用这个。使用它不是很安全(
t
可以是任何值,也是在异常中处理非空情况的唯一方法)


也就是说,我认为您现在创建它的方式,使用无法初始化的类是最好的方法。事实上,唯一的问题是:为什么要使用
null
,而不是在结构上使用默认值实例(
X.null
)。

为什么要这样做?您已经可以检查可空类的
.HasValue
?还提出了关于结构与类以及您的用例的问题。好问题。显然,这只适用于可空类型。@Belogix:出于空间原因,我不想使用
nullable
,因为它会将
bool
成员插入到我的结构中,由于对齐限制,这可能会花费我多达8个字节的时间。我更希望将null建模为一个特殊常量(参见我更新的示例)。从null强制转换只是一种方便且可读的方法,用于构造具有特殊null值的结构。为什么使用struct而不是类?@silver:因为在我的应用程序中,将这些东西存储在堆上会有点过分。@您的问题:
null
X.null
更简洁。如果该值的含义真的是“如果它是一个类,则将其完全视为null值”,那么
null
似乎是最合适的。此外,我还重构了代码
X
以前是一门课。因此,有很多地方已经使用了
null
,因此允许这样做需要更少的努力。好的,但是,通过使用
null
,以真正的意义使用它(也称为:支持编译器),但您不希望这样。所以不是这个就是那个。别担心,你只需要通过你的代码进行一次检查。这将需要一两个小时,但之后您就完成了。遗憾的是,即使我想使用
Nullable
,它也不允许使用
=null
语法(cf.)。也就是说,编译器不支持
Nullable
。您可以。这是关于
Nullable
的自定义实现<允许代码>=null。这是一种魔法。