2015-06-22 19 views
18

Visual Studio 2013'te bu birim testinin neden başarısız olduğu konusunda herhangi bir ışık tutabilir mi? ÇünküC# derleyicisi null türlerini optimize ediyor mu?

[TestMethod] 
public void Inconceivable() 
{ 
    int? x = 0; 
    Assert.AreEqual(typeof(int?), x.GetType()); 
} 
+0

Assert.IsInstanceOfType (? X typeof (int)); –

+0

Derleyici tarafından statik olarak belirlenen bir şeyi neden denemeye çalışıyorsunuz? 'x' * bir' int 'dışında bir şey olamaz ya da program derlemez. – Servy

+2

@Servy - Anladığım kadarıyla, ünite testi başarısız olduğunda başarısız oldu. Discosultan nedenini açıklamak için mükemmel bir iş yaptı. GetType'ın böyle davranması gerekip gerekmediğini tartışmak için filozoflara bırakıyorum. –

cevap

27

Testiniz başarısız:

bir null türüne GetType çağrılması tipi örtük Object dönüştürüldüğünde bir boks operasyon yapılmasına neden olur. Bu nedenle, GetType her zaman Nullable türünü değil, temel türünü temsil eden Tip nesnesini döndürür.

How to: Identify a Nullable Type'dan daha fazlasını okuyabilirsiniz. Bir önceki yazıda alınan

Bazı örnekler:

int? i = 5; 
Type t = i.GetType(); 
Console.WriteLine(t.FullName); //"System.Int32" 

Ayrıca unutmayın:

C# is operatör de null altında yatan tipine çalışır. Bu nedenle, bir değişkenin bir NULL türüne sahip olup olmadığını belirlemek için 'un kullanamazsınız. Aşağıdaki örnek, 'un operatörünün bir Null olarak <int> değişkenini int olarak kabul ettiğini gösterir.


int? i = 5; 
if (i is int) { ... } // true 
Sen C# derleyicisi null türleri optimize olduğunu iddia ederken doğrudur.

Sadece boks açısından ve CLR null türleri ile ilgili herhangi özel bir davranış olduğunu kutudan çıkarma ile açıklanmıştır: Burada sorunuza cevap gerektiğini Jon Skeet en C# in Depth bir alıntı. Aslında, davranış yalnızca topluluk isteklerinin sonucu olarak .NET 2.0 sürümünden kısa bir süre önce değiştirildi.

NULL ya da boş bir değere (bir değere sahip değilse) veya kutulanmış bir T değerine (eğer varsa) Nullable örneği kutulanır. Asla “kutulu nullable int” olarak işaretlenmez - böyle bir tip değildir.


StackOverflow'daki benzer iplik var: Nullable type is not a nullable type?

+0

Bu bir anlamsal süreksizlik, eğer ' ve hiç gördün! –

İlgili konular