可空类型和赋值运算符

时间:2012-05-04 20:13:37

标签: c# .net operator-overloading nullable assignment-operator

我一直认为.NET框架的可空类型只是框架给我们的一个很好的构造,但并没有添加到语言本身的任何新东西。

也就是说,直到今天,为了演示,我试图创建自己的Nullable结构。

我得到了我需要的一切,除了这样做的能力:

var myInt = new Nullable<int>(1);
myInt = 1;

问题是第二个陈述,因为我不能以任何方式重载赋值运算符。

我的问题是:这是一个特殊情况,在赋值运算符有过载的语言中?如果没有,您将如何使之前的示例有效?

谢谢!

4 个答案:

答案 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)

根据此页面Operator overloading

  

请注意,赋值运算符本身(=)不能重载。

您可以定义implicit operator