簡體   English   中英

將動態對象傳遞給 C# 方法會更改返回類型

[英]Passing dynamic object to C# method changes return type

我創建了一個繼承DynamicObject類,並希望創建一個靜態方法,該方法可以創建具有預先確定的屬性(存儲在Dictionary )的新實例。

public class CustomDynamic : DynamicObject
{
    protected Dictionary<string, object> InnerDictionary;

    public static T Create<T>(Dictionary<string, object> dictionary) where T : CustomDynamic , new()
    {
        return new T
        {
            InnerDictionary = dictionary
        };
    }
}

用法:

dynamic d = new Dictionary<string, object>();

var realPlayer = CustomDynamic.Create<Player>(d as Dictionary<string, object>);
var dynaPlayer = CustomDynamic.Create<Player>(d);

realPlayer // Player type according to VS2013
dynaPlayer // dynamic type according to VS2013

既然只有一個方法簽名,為什么傳入一個動態返回一個動態對象呢? 或者實際上只是 Visual Studio 2013 感到困惑?

這是因為幾乎所有涉及動態值的操作都是在執行時動態解析的。 對於在編譯時實際上只有一種方法的情況,沒有例外; 這樣語言就更簡單了。 (對於某些調用,編譯器確實在編譯時執行了足夠的解析,以確保至少有一個方法具有合適數量的參數 - 這在 C# 5 規范的第 7.5.4 節中指定,但這並沒有影響有效的返回類型。)

來自 C# 5 規范的第 7.6.5 節:

如果至少滿足以下條件之一,則調用表達式是動態綁定的:

  • 主表達式具有編譯時類型dynamic
  • 可選參數列表的至少一個參數具有編譯時類型dynamic並且主表達式沒有委托類型。

在這種情況下,編譯器將調用表達式分類為dynamic類型的值。 [...]

一些涉及動態值的操作仍然具有非動態整體類型。 例如:

  • d is Foo總是bool
  • d as Foo總是Foo
  • new Foo(d)總是Foo即使要使用的確切構造函數是在執行時確定的

但是任何方法調用都被視為具有返回類型dynamic

這就是動態的工作原理。 來自MSDN

如果方法調用中的一個或多個參數具有動態類型,或者方法調用的接收者是動態類型,則重載解決發生在運行時而不是編譯時。

您可能認為您的方法沒有任何額外的重載,但您可能有。 編譯器不會在編譯時執行該檢查,所以這就是為什么您將dynaPlayer的類型視為動態而不是Player

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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