[英]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#參考確實指出“包含動態類型表達式的操作無法解析”,我的問題是:
有什么原因阻止編譯器解析“外部” /周圍表達式的類型?
參考
在大多數情況下,動態類型的行為類似於類型對象。 但是,編譯器無法解析或檢查包含動態類型的表達式的操作。 編譯器將有關該操作的信息打包在一起,以后該信息將用於在運行時評估該操作。 在此過程中,動態類型的變量將被編譯為對象類型的變量。 因此,動態類型僅在編譯時存在,而在運行時不存在。
假設你有
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.