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