我有一个类型的变量,Func<dynamic>我试图给它一个值.如果我将它分配给返回值类型的方法(例如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
Run Code Online (Sandbox Code Playgroud)
直接转让案有什么问题?
这与dynamic或无关delegate 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
Run Code Online (Sandbox Code Playgroud)
由于某种原因,像这样的值类型int会自动转换为objector dynamic,但I<int>不会自动转换为I<object>or I<dynamic>。我找不到语言参考中指定的位置。
在您的代码中起作用的原因Func<dynamic> h = () => Test2();是因为它只需要隐式int转换dynamic,这很好。它不需要隐式Func<int>转换Func<dynamic>。