[英]Is the C# compiler optimizing nullable types?
任何人都可以了解為什么這個單元測試在Visual Studio 2013中失敗了?
[TestMethod]
public void Inconceivable()
{
int? x = 0;
Assert.AreEqual(typeof(int?), x.GetType());
}
您的測試失敗,因為:
在Nullable類型上調用GetType會導致在將類型隱式轉換為Object時執行裝箱操作。 因此, GetType始終返回表示基礎類型的Type對象,而不是Nullable類型。
您可以從如何:識別可空類型中了解更多信息 。
從前一篇文章中摘取的一些例子:
int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
另請注意:
C#的是操作者也可為空的基本類型進行操作。 因此,您無法使用is來確定變量是否為Nullable類型。 以下示例顯示is運算符將Nullable <int>變量視為int。
int? i = 5;
if (i is int) { ... } // true
假設C#編譯器正在優化可空類型,你是正確的。 以下是Jon Skeet的深度C#的引用,它應該回答你的問題:
只有在裝箱和拆箱方面,CLR才有關於可空類型的任何特殊行為。 實際上,這種行為只是在.NET 2.0發布之前不久發生了變化,這是社區請求的結果。
Nullable的實例被裝箱為空引用(如果它沒有值)或盒裝值T(如果有)。 它永遠不會裝入“盒裝可空的int” - 沒有這種類型。
StackOverflow上有一個類似的線程: Nullable類型不是可以為空的類型?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.