2012-05-04 88 views
4

我一直認爲.NET框架的可以爲空的類型只有框架提供給我們的一個很好的構造,但沒有任何新增加到語言本身。可空類型和賦值運算符

也就是說,直到今天,爲了演示的目的,我嘗試創建自己的Nullable結構。

我得到我需要的一切,但這樣做的能力:

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

的問題是第二個發言,因爲我不能以任何方式,重載賦值運算符。

我的問題是:這是一個特殊的情況下,在賦值運算符有重載的語言?如果不是的話,你如何處理前一個例子的工作?

謝謝!

回答

10

分配是問題的處理使用隱式運算符聲明:

public static implicit operator Nullable<T> (T value)

這沒有任何特定語言的功能的處理。

主要的變化到的langauge爲空的支持是因爲寫的能力:

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

+2

很好的答案。另外,CLR支持可空值的null值爲空引用。 – usr

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; 
5

同上其他答案,但請注意,Nullable<T>確實也做了一些magic以及。

通過利珀特

C#從答案自動競標升降機運營商可爲空的。沒有辦法說 「自動提升運營商到MyNullable」。通過編寫自己的用戶定義的運算符,您可以非常接近 。

C#有空文字的特殊規則 - 您可以將它們分配給 可爲空的變量,並將它們與可以爲空的值進行比較,編譯器會爲它們生成特殊代碼。

可空的裝箱語義是非常奇怪的,並烘焙到 運行時。沒有辦法模仿他們。

對於is和as的合併操作符的可空語義會烘焙到 中。

可空行不滿足結構約束。 沒有辦法模仿。

依此類推。