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

Wenn es keine new() Einschränkung gibt, verstehe ich, wie es funktionieren würde. Der JIT-Compiler sieht T und wenn es ein Referenztyp ist, verwendet er die Objektversionen des Codes und ist auf jeden Werttyp spezialisiert.C# - Wie generieren Generics mit der neuen() Einschränkung Maschinencode?

Wie funktioniert es, wenn Sie ein neues T() drin haben? Wo sucht es?

+1

Die neue() Einschränkung bedeutet, dass Ihre Art, die eine Standard (parameter) Konstruktor haben muss –

Antwort

4

Wenn Sie meinen, wie die IL aussieht, kompiliert der Compiler in einem Aufruf an Activator.CreateInstance<T>.

Der Typ, den Sie als T übergeben, muss einen öffentlichen parameterlosen Konstruktor haben, um den Compiler zu erfüllen.

Sie können dies testen in Try Roslyn:

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

wird:

.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

Folgen Frage für diese http up: //stackoverflow.com/questions/32553686/c-sharp-why-does-a-class-new-constraint-use-activator-creatinstancet. – Rahul