我有一个Func<dynamic>
类型的变量,我正在尝试为它赋值。如果我将它分配给返回值类型的方法(例如int
),我会收到错误
&#39; int MethodName()&#39;有错误的返回类型
但是,如果我将方法包装在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 :(得分:4)
这与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
出于某种原因,int
等值类型会自动转换为object
或dynamic
,但I<int>
不会自动转换为{ {1}}或I<object>
。我无法找到指定语言参考的位置。
I<dynamic>
在您的代码中起作用的原因是因为它只需要Func<dynamic> h = () => Test2();
隐式转换为int
,这很好。 <* 1}}无需隐式转换为dynamic
。