簡體   English   中英

為什么在C#中不能動態解析動態表達式的周圍類型?

[英]Why is the surrounding type of a dynamic expression not statically resolved in C#?

在動態表達式dynamic x是否有原因/解釋為何周圍的表達式(例如foo(x) )也變得動態?

考慮:

static string foo(object x) { }

static void Main()
{
  dynamic x = null;
  foo(x);  // foo(x) is a dynamic expression
}

我以為編譯器可以(在編譯時)解析要調用foo(object)情況。 但是,將鼠標懸停在foo(x)顯示該類型是動態的。

我可以通過指定來幫助編譯器進行推導:

foo((object)x);

但是我認為dynamic表達式的類型是object

C#參考確實指出“包含動態類型表達式的操作無法解析”,我的問題是:

有什么原因阻止編譯器解析“外部” /周圍表達式的類型?

參考

在大多數情況下,動態類型的行為類似於類型對象。 但是,編譯器無法解析或檢查包含動態類型的表達式的操作。 編譯器將有關該操作的信息打包在一起,以后該信息將用於在運行時評估該操作。 在此過程中,動態類型的變量將被編譯為對象類型的變量。 因此,動態類型僅在編譯時存在,而在運行時不存在。

https://msdn.microsoft.com/zh-CN/library/dd264741.aspx

假設你有

static string foo(object x) { return "bar"; }
static string foo(string x) { return "foo"; }

static void Main()
{
  dynamic x = null;
  foo(x);  // foo(x) is a dynamic expression
}

在這種情況下,編譯器將無法解析表達式的類型。 雖然我認為在您的示例中,該類型應該是可解析的,但在最有用的情況下將無法解析,這使得該功能的實現成本相當低。

此外,DLR無法像您的示例一樣對空引用執行任何綁定。

這背后的原因是動態類型無法與編譯器一起使用,但可以在DLR中解析它們。 編譯器無法知道動態將解析為哪種類型...這就是為什么任何與動態有關的事物都只能在運行時解析的原因。

有關DLR的更多信息: https : //msdn.microsoft.com/zh-cn/library/dd233052.aspx

暫無
暫無

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

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