4
問這個最簡單的方法是要表明,在手演示問題的例子(LinqPad)代碼:爲什麼泛型類型的表達式引用約束類型而不是運行時類型?
void Main()
{
GetProp<IFace>().DeclaringType.Dump(); // iface
GetProp<C>().DeclaringType.Dump(); // iface
GetProp().DeclaringType.Dump(); // c
}
public interface IFace { int A { get; set; } }
public class C : IFace { public int A { get; set; } }
public PropertyInfo GetProp<T>() where T : IFace
{
return ExtractProperty((T x) => x.A);
}
public PropertyInfo GetProp()
{
return ExtractProperty((C x) => x.A);
}
private PropertyInfo ExtractProperty<T, V>(Expression<Func<T, V>> exp)
{
return (PropertyInfo) ((MemberExpression) exp.Body).Member;
}
我明白爲什麼GetProp<C>
使用收益上IFace
而不是在C
性質的性質很感興趣。誰能解釋這種行爲?看看IL code
,我可以看到GetProp<T>
的通用版本在IFace
類型上使用ldtoken,但它爲什麼以這種方式實現?任何人都可以指出我對此行爲的理由或規範嗎?
_ 「名爲N對象」 _ - 什麼對象? –
@RoyiNamir:類型'System.Object'。 – SLaks