簡體   English   中英

C#編譯器是否優化了可空類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM