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的完整解释: