无法将返回值类型的方法分配给Func <dynamic>

时间:2015-11-05 19:29:39

标签: c# dynamic func

我有一个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

直接转让案件有什么问题?

1 个答案:

答案 0 :(得分: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>不会自动转换为{ {1}}或I<object>。我无法找到指定语言参考的位置。

I<dynamic>在您的代码中起作用的原因是因为它只需要Func<dynamic> h = () => Test2();隐式转换为int,这很好。 <* 1}}无需隐式转换为dynamic