[英]Why .net Framework modify an expression for value types calling a Convert function?
我在尋找解釋而不是解決方案:這是我注意到的。 假設我有一個下面的方法Test與Expression一起使用。 由於Func
的返回parameter
是"object"
,因此當我使用值類型屬性(Test<TestClass>(x => x.SomeInt))
調用函數時,框架將我的表達式包裝為x=> Convert(x.SomeInt)
和.Body
,如果不再鍵入MemberExpression
。 可能是由於boxing/unboxing
? 但這在哪里記錄。
static void Test<TEntity>(Expression<Func<TEntity, object>> memberExpression)
{
//if value type, body is Convert(x.SomeInt)
var body = memberExpression.Body.ToString();
}
class TestClass
{
public int SomeInt { get; set; }
public string SomeString { get; set; }
}
static void Main(string[] args)
{
Test<TestClass>(x => x.SomeInt);
Test<TestClass>(x => x.SomeString);
}
因為lambda的類型是T => object
。 當您將值類型轉換為對象時,由於轉換,.NET運行時需要做一些工作(創建值類型的框式實例)。 當轉換為引用類型時,它不會出現,因為強制轉換RefType => object是op。
您可以使用Foo<T, TResult>(Expression<Func<T,TResult>> expr)
改進代碼。
由於表達式可以在運行時進行編譯並從其結構生成CIL(.NET字節碼),因此它們引入了特殊節點,以生成CIL裝箱指令box
或調用方法以在存在用戶定義的轉換時執行自定義轉換。 這種表達方式反映了編譯器將生成的實際代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.