2015-11-05 80 views
8

我有一個類型爲Func<dynamic>的變量,我試圖給它賦值。如果我把它分配給一個返回值類型的方法(例如int),我得到的錯誤無法將返回值類型的方法分配給Func <dynamic>

「詮釋方法名()」有錯誤的返回類型

如果我換的方法lambda調用,但是,它工作正常。另外返回引用類型的方法似乎工作正常。

private string Test() 
{ 
    return ""; 
} 

private int Test2() 
{ 
    return 0; 
} 

Func<dynamic> f = Test;   // Works 
Func<dynamic> g = Test2;   // Does not 
Func<dynamic> h =() => Test2(); // Works 

直接分配案例有什麼問題?

+0

這不只是'動態'。如果您將'Func '更改爲'Func ',您會得到相同的錯誤,我認爲這是因爲裝箱操作會間接引入,而編譯器對此不太確定,但在規範中找不到任何內容會描述這種情況。 – MarcinJuraszek

+0

@MarcinJuraszek從關於委託相容性的規範中,「對於每個值參數(沒有ref或out修飾符的參數),從參數類型存在標識轉換(§6.1.1)或隱式引用轉換(§6.1.6)在D中相應於M中的參數類型。「在這種情況下存在隱式轉換,但它不是標識或引用轉換。 – Servy

回答

4

這與dynamicdelegate TResult Func<out TResult>()無關。你會看到相同的行爲在此代碼:

interface I<out T> { } 
class C<T> : I<T> { } 
... 
I<int> a = new C<int>(); 
I<string> b = new C<string>(); 
I<object> x = a; // compiler error 
I<object> y = b; // no compiler error 

出於某種原因,價值類型,如int將自動轉換爲objectdynamic,但I<int>不會自動投地I<object>I<dynamic>。我無法找到指定的語言參考位置。

原因Func<dynamic> h =() => Test2();在你的代碼中工作是因爲它只需要int隱式轉換爲dynamic,這很好。它不要求Func<int>隱式轉換爲Func<dynamic>

+0

Eric Lippert的完整解釋:http://stackoverflow.com/a/4098434/1828879 –

相關問題