C# Can';t将返回值类型的方法赋值给Func<;动态>;

C# Can';t将返回值类型的方法赋值给Func<;动态>;,c#,dynamic,func,C#,Dynamic,Func,我有一个Func类型的变量,我正试图给它赋值。如果将其分配给返回值类型的方法(例如,int),则会得到错误 “int MethodName()”的返回类型错误 但是,如果我将该方法包装在lambda调用中,它就可以正常工作。此外,返回引用类型的方法似乎工作正常 private string Test() { return ""; } private int Test2() { return 0; } Func<dynamic> f = Test;

我有一个
Func
类型的变量,我正试图给它赋值。如果将其分配给返回值类型的方法(例如,
int
),则会得到错误

“int MethodName()”的返回类型错误

但是,如果我将该方法包装在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
私有字符串测试()
{
返回“”;
}
私有int Test2()
{
返回0;
}
Func f=测试;//作品
Func g=Test2;//不
Func h=()=>Test2();//作品

直接赋值案例有什么问题?

这与
动态
委托TResult Func()无关。您将在此代码中看到相同的行为:

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
接口I{}
C类:I{}
...
I a=新的C();
I b=新的C();
I x=a;//编译错误
I y=b;//没有编译器错误
由于某些原因,像
int
这样的值类型将自动转换为
对象
动态
,但
I
不会自动转换为
I
I
。我在语言引用中找不到指定的位置


原因
Func h=()=>Test2()在代码中起作用是因为它只需要
int
隐式转换为
dynamic
,这很好。它不需要
Func
隐式转换为
Func

它不仅仅是
动态的
。如果将
Func
更改为
Func
,则会出现相同的错误,我认为这是因为装箱操作会间接引入,编译器对此不满意,但我在规范中找不到任何可以描述这种情况的内容。@MarcinJuraszek,来自“委托兼容性规范”,用于每个值参数(不带ref或out修饰符的参数)、标识转换(§6.1.1)或隐式引用转换(§6.1.6)存在于从D中的参数类型到M中的相应参数类型之间。“在这种情况下,存在隐式转换,但它不是标识或引用转换。Eric Lippert的完整解释: