簡體   English   中英

為什么.net Framework會修改用於調用Convert函數的值類型的表達式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM