2012-12-12 14 views
1

爲什麼編譯器讓這個表達式編譯,而運行時異常是不可避免的?C#動態綁定和void方法調用

我不認爲Dynamic Binding應該無效方法

static void Main(string[] args) 
{ 
    var res = Test((dynamic)"test"); // throws RuntimeBinderException exception at runtime 
} 

static void Test(dynamic args) 
{ 
} 

工作,如果C#規範是指上述表達式作爲動態綁定表達式爲什麼不下面的方法編譯?

static dynamic DynamicMethod() 
{ 
} 
+4

基本上,當你拋出'dynamic'到池中時,任何一種編譯時檢查都會退出窗口。這就是整個觀點。 – Servy

+0

那麼爲什麼第二個方法會引發編譯時異常? –

+0

在第二種情況下,你知道它沒有返回任何東西,在運行時沒有任何東西可以改變,以使它返回一些東西。在第一種情況下,可能有一些它不知道的方法(但是)可以讓它編譯和運行。 – Servy

回答

3

測試((動態)「abc」)的整體評估爲動態語句。更完全,你可以有:

public static string Test(string s) { return s; } 

這將是一個更好的過載,因此我們將選擇優先於其他方法執行。

或換句話說:無法知道返回是否無效,而無需將方法組解析爲特定簽名。根據定義,重載分辨率爲,直到動態調用的運行時間爲止。

它可以做更多的分析嗎?大概。但是規範並不要求它,所以絕對最可能是一個警告(不是錯誤)。

+0

哇,謝謝Marc,那很棒 –