我一直认为.NET框架的可空类型只是框架给我们的一个很好的构造,但并没有添加到语言本身的任何新东西。
也就是说,直到今天,为了演示,我试图创建自己的Nullable结构。
我得到了我需要的一切,除了这样做的能力:
var myInt = new Nullable<int>(1);
myInt = 1;
问题是第二个陈述,因为我不能以任何方式重载赋值运算符。
我的问题是:这是一个特殊情况,在赋值运算符有过载的语言中?如果没有,您将如何使之前的示例有效?
谢谢!
答案 0 :(得分:10)
赋值是使用声明为:
的隐式运算符处理的 public static implicit operator Nullable<T> (T value)
这是在没有任何语言特定功能的情况下处理的。
对可空支持的语言的主要改变是能够将其写为:
int? myInt = 1;
您可以通过以下方式在您的类型中实现此目的:
public static implicit operator Nullable<T> (T value)
{
return new Nullable<T>(value);
}
令人遗憾的是,有许多与Nullable<T>
C#语言相关的功能,而CLR与can't be duplicated in your code相关。
答案 1 :(得分:5)
同样关注其他答案,但请注意Nullable<T>
也会做一些magic。
引自Lippert的回答
C#自动将运营商提升为可空。没有办法说 “自动将运营商提升为MyNullable”。你可以非常接近 通过编写自己的用户定义的运算符。
C#对null文字有特殊规则 - 你可以将它们分配给 可空变量,并将它们与可空值进行比较,以及 编译器为它们生成特殊代码。
Nullables的拳击语义非常奇怪,并且融入了 运行。没有办法模仿它们。
is,as和coalescing运算符的Nullable语义被烘焙 在语言中。
Nullables不满足struct约束。没有办法 模仿那个。
等等。
答案 2 :(得分:3)
不是赋值运算符被重载,但是类Nullable<T>
指定了一个隐式转换运算符,它能够将T
转换为Nullable<T>
。
您可以轻松地将此功能添加到您的课程中:
class MyInteger {
private int value;
public MyInteger(int value) { this.value = value; }
public static implicit operator MyInteger(int value) {
return new MyInteger(value);
}
}
然后以相同的方式使用运算符:
MyInteger obj = 123;
答案 3 :(得分:1)