2016-09-17 20 views
2

考慮遵循簡單的類C#智能感知不正確的方法,它有一個動態的參數

public class SomeType 
{ 
    public static int Fn(dynamic arg) { return 1; }    
} 

及後續聲明

dynamic value = 10; 
var a = SomeType.Fn(null); 
var b = SomeType.Fn(value); 

的類型是正確的(INT)

類型的b是錯誤的(動態)

我不能在b上使用智能感知,直到我做一個虛擬重鑄(int)SomeType.Fn(值)爲已經原型的返回一個整數。

問題是,爲什麼參數中的動態會使intellisense改變我的函數原型簽名?

即使我將一個動態插入到函數中,該函數只能返回其原型中聲明的內容,這是一個錯誤嗎?

我當前解決方法如下

var b = SomeType.Fn((object)value); 
+0

它看起來像一個錯誤。你在使用VS2015嗎? –

+0

它不會改變b的類型,它仍然是'int'(使用'b.GetType()'),也許是intellisense上的錯誤? –

+1

對我來說,看起來不像是一個Intellisense錯誤。智能感知行爲與編譯器的行爲相匹配,不是嗎? – hvd

回答

2

有一個簡單的方法來檢查這是否是一個智能感知錯誤:調用不適用於int的方法。如果編譯器給出類型爲int的變量,則會出現編譯時錯誤。如果編譯器給出的變量類型爲dynamic,則會出現運行時錯誤。

dynamic value = 10; 
var a = SomeType.Fn(null); 
a.DoesNotExist(); 
var b = SomeType.Fn(value); 
b.DoesNotExist(); 

如果您嘗試此操作,您會發現只有a.DoesNotExist()會導致編譯時錯誤。

換句話說,您所看到的Intellisense行爲與編譯器的行爲完全匹配,即涉及dynamic參數的方法調用的結果爲dynamic

您的解決方法不是解決方法,它是一種解決方法。如果有dynamic類型,則要求編譯器確保在運行時解析表達式。當您投射到object時,您將取出dynamic類型,此時編譯器將在編譯時再次完全解析表達式。