我一直认为.NET框架中的可空类型只是一个好的构造,是框架给我们提供的,而并没有添加任何新的语言功能。
直到今天,出于演示目的,我尝试创建自己的Nullable结构体,我得到了所有我需要的东西,除了能够做到这一点:
var myInt = new Nullable<int>(1);
myInt = 1;
问题出在第二个语句,因为无论如何我都不能重载赋值运算符。
我的问题是:在这种语言中是否有特殊情况,即赋值运算符有一个重载?如果没有,你会如何解决之前的例子?
谢谢!
我一直认为.NET框架中的可空类型只是一个好的构造,是框架给我们提供的,而并没有添加任何新的语言功能。
直到今天,出于演示目的,我尝试创建自己的Nullable结构体,我得到了所有我需要的东西,除了能够做到这一点:
var myInt = new Nullable<int>(1);
myInt = 1;
这个任务使用一个被声明为隐式运算符的方式来处理:
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>
也会进行一些魔法。并非重载赋值运算符,而是类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;