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

Quando non c'è il vincolo new(), ho capito come funzionerebbe. Il compilatore JIT vede T e se è un tipo di riferimento rende utilizza le versioni dell'oggetto del codice, ed è specializzato per ogni caso tipo di valore.C# - Come generici con il nuovo() codice macchina get vincolo generati?

come funziona se si dispone di un nuovo T() in là? Dove cerca?

+1

Il nuovo() vincolo significa che il tipo deve avere una (senza parametri) costruttore di –

risposta

4

Se si intende, a cosa assomiglia l'IL, il compilatore compilerà una chiamata a Activator.CreateInstance<T>.

Il tipo si passa come T deve avere un costruttore senza parametri pubblica per soddisfare il compilatore.

È possibile verificare questo in Try Roslyn:

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

diventa:

.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

predefinita Follow-up domanda per questo http: //stackoverflow.com/questions/32553686/c-sharp-why-does-a-class-new-constraint-use-activator-createinstancet. – Rahul

Problemi correlati