根據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
的文檔是否錯誤?我錯過了什麼嗎?
根據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
的文檔是否錯誤?我錯過了什麼嗎?
這是正確的行爲嗎?
是的。
是否錯誤的文檔?
是的。我已通知文檔管理員。感謝您將此引起我的注意,並對錯誤表示歉意。顯然沒有人記得在C#2.0中將可空類型添加到語言中時更新此頁面。
我錯過了什麼嗎?
您可能會考慮閱讀實際的C#規範而不是MSDN文檔;它更明確。
只是一個猜測,但我會說這盒O作爲一個整數,然後將其轉換爲空。
差不多。如果它是一個整數,它會將整個對象作爲整數拆箱,然後將其轉換爲可空對象。如果拆箱失敗,那麼結果當然是一個空的可空int。 –
您正在將'as'應用於Object,它是一個引用類型。它可以爲null,在這種情況下,CLR特別支持將參考'null'拆箱爲可爲null的值類型。對於任何其他值類型,此特殊拆箱不受支持,因此即使Nullable爲值類型,它也具有某些特殊權限。
大約從作爲關鍵字的文檔:
除了表達式求值只有一個時間,它是等效於以下表達式。
表達式是類型? (類型)的表達:(型)空
爲的引用使用還說但是它的工作原理與引用類型,你也可以做這樣的東西:
int? temp = null;
if (temp is int?)
{
// Do something
}
我猜測這只是參考文檔中的一個不準確之處,其類型必須是可爲空(即可爲空類型或引用類型),而不僅僅是引用類型。
顯然,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.
可爲空是值類型,我已更正您的文本。 –
@Matthew:謝謝。這是一個相當混亂的錯字。 – recursive
關於AS/IS和Nullables的大討論 - http://stackoverflow.com/questions/1583050/performance-surprise-with-as-and-nullable-types – sll