2015-09-13 26 views
5
public T Foo<T, U>(U thing) where T : new() 
{ 
    return new T(); 
} 

new() kısıtlaması olmadığında, nasıl çalışacağını anlıyorum. JIT Derleyicisi T'yi görür ve eğer bir referans türü yaparsa, kodun nesne sürümlerini kullanır ve her bir değer türü vakası için uzmanlaşır.C# - Yeni() kısıtlama ile jenerikler makine kodu nasıl oluşturulur?

Orada yeni bir T() varsa nasıl çalışır? Nereye bakıyor?

+1

yeni() kısıt senin tipin bir varsayılan (parametresiz) kurucu –

cevap

4

Eğer IL'in neye benzediği kastediyorsanız, derleyici Activator.CreateInstance<T> numaralı çağrıya derlenir.

T olarak geçirdiğiniz tür, derleyiciyi karşılamak için ortak parametresiz bir kurucuya sahip olmalıdır.

Sen Try Roslyn bu test edebilirsiniz:

public static T Test<T>() where T : class, new() 
{ 
    return new T(); 
} 

olur:

.method public hidebysig static 
    !!T Test<class .ctor T>() cil managed 
{ 
    // Method begins at RVA 0x2050 
    // Code size 6 (0x6) 
    .maxstack 8 

    IL_0000: call !!0 [mscorlib]System.Activator::CreateInstance<!!T>() 
    IL_0005: ret 
} // end of method C::Test 
+0

sahip bu http soruyu takip gerektiği anlamına gelir: //stackoverflow.com/questions/32553686/c-sharp-why-does-a-class-new-constraint-use-activator-createinstancet. – Rahul

İlgili konular