2011-08-18 60 views
19

根據as operator的文檔,as「用於執行兼容參考類型之間的某些類型的轉換」。由於可爲空is actually a value type,我預計as不適用於它。但是,此代碼編譯並運行:爲什麼as操作符可以與Nullable <T>一起使用?

object o = 7; 
int i = o as int? ?? -1; 
Console.WriteLine(i); // output: 7 

這是正確的行爲嗎? as的文檔是否錯誤?我錯過了什麼嗎?

+3

可爲空是值類型,我已更正您的文本。 –

+0

@Matthew:謝謝。這是一個相當混亂的錯字。 – recursive

+1

關於AS/IS和Nullables的大討論 - http://stackoverflow.com/questions/1583050/performance-surprise-with-as-and-nullable-types – sll

回答

21

這是正確的行爲嗎?

是的。

是否錯誤的文檔?

是的。我已通知文檔管理員。感謝您將此引起我的注意,並對錯誤表示歉意。顯然沒有人記得在C#2.0中將可空類型添加到語言中時更新此頁面。

我錯過了什麼嗎?

您可能會考慮閱讀實際的C#規範而不是MSDN文檔;它更明確。

2

我閱讀:

請注意,as運算符僅執行參考轉換和裝箱轉換。 as運算符不能執行其他轉換,例如用戶定義的轉換,而應該使用轉換表達式來執行轉換。

和拳擊轉換.....

+0

但它不只是簡單的拳擊,因爲它只是一個普通的' int'是盒裝的,而'int?'是'as'的目標。 – recursive

+0

爲什麼你認爲int?必須從這個問題的角度以不同的方式進行管理? – Tigran

+0

我不知道爲什麼它不同。從某種意義上說,這與我所問的有關。 – recursive

1

只是一個猜測,但我會說這盒O作爲一個整數,然後將其轉換爲空。

+1

差不多。如果它是一個整數,它會將整個對象作爲整數拆箱,然後將其轉換爲可空對象。如果拆箱失敗,那麼結果當然是一個空的可空int。 –

0

您正在將'as'應用於Object,它是一個引用類型。它可以爲null,在這種情況下,CLR特別支持將參考'null'拆箱爲可爲null的值類型。對於任何其他值類型,此特殊拆箱不受支持,因此即使Nullable爲值類型,它也具有某些特殊權限。

1

大約從作爲關鍵字的文檔:

除了表達式求值只有一個時間,它是等效於以下表達式。

表達式是類型? (類型)的表達:(型)空

的引用使用還說但是它的工作原理與引用類型,你也可以做這樣的東西:

int? temp = null; 
if (temp is int?) 
{ 
    // Do something 
} 

我猜測這只是參考文檔中的一個不準確之處,其類型必須是可爲空(即可爲空類型或引用類型),而不僅僅是引用類型。

1

顯然,as operator上的MSDN文檔需要更新。

object o = 7; 
int i = o as **int** ?? -1; 
Console.WriteLine(i); 

如果你嘗試下面的代碼,我們使用的運營商與值類型爲int,你會得到相應的編譯器錯誤消息

as運算符必須與引用類型使用或空類型(「INT」是一個非空值類型)

有雖然上the link在社區內容節引述的更新:

The as operator must be used with a reference type or nullable type. 
相關問題