2015-11-05 96 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 –

相关问题