2017-05-09 57 views
0

有沒有辦法避免拳擊方法(無界面)的一般參數?如何避免裝箱的一般參數

在一個虛擬擴展方法中,我嘗試了約束where T : class來強制解釋T至少爲object,但仍然發生拳擊。

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

這裏是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 

任何線索?

+1

由於您已經禁止從屬於值類型的泛型參數,所以您無法創建* * * *的盒子,因爲*它已經是引用類型*。 – Servy

+0

這就是爲什麼我不明白'IL_0002:box !! T'行... – gfache

+0

如果需要裝箱的值*,它永遠不會包含該值。 – Servy

回答

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

這一個會工作,但也許你的問題是更通用的,這個具體的例子,因爲你實際上沒有使用通用模板。