我可以超载吗;“从零开始强制转换”;C#中的运算符?
我在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
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。这是一种魔法。