2017-05-09 8 views
0

Existe-t-il un moyen d'éviter la mise en boîte d'un argument générique d'une méthode (pas d'interface)?Comment éviter la mise en boîte d'un argument générique

Dans une méthode d'extension factice, j'ai essayé la contrainte where T : class pour forcer l'interprétation de T comme au moins un object sur mais la boxe se produit encore.

public static bool IsNull<T>(this T obj) where T : class 
{ 
    return obj == null; 
} 

Voici le code IL:

IL_0000: nop 
IL_0001: ldarg.0 
IL_0002: box !!T 
IL_0007: ldnull 
IL_0008: ceq 
IL_000a: stloc.0 
IL_000b: br.s IL_000d 

IL_000d: ldloc.0 
IL_000e: ret 

Un indice?

+1

Puisque vous avez interdit que l'argument générique soit un type de valeur, vous ne pouvez jamais créer une situation dans laquelle * est * encadré, car * il s'agit déjà d'un type de référence *. – Servy

+0

C'est pourquoi je ne comprends pas que la ligne 'IL_0002: box !! T' ... – gfache

+0

L'instruction écrira la valeur * si la valeur doit être encadrée *, ce qu'elle ne fera jamais. – Servy

Répondre

-1
public static bool IsNullObj<T>(this object obj) 
    { 
     return obj == null; 
    } 

Celui-ci fonctionnerait, mais peut-être votre question est plus générique que cet exemple spécifique puisque vous ne l'utilisez pas en fait le modèle générique.