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

Can't assign methods that return value types to Func<dynamic>

我有一个 Func<dynamic> 类型的变量,我正在尝试为其赋值。如果我将它分配给一个 return 是值类型的方法(例如 int),我会得到错误

'int MethodName()' has the wrong return type

但是,如果我将方法包装在 lambda 调用中,它就可以正常工作。 return 引用类型的方法似乎也能正常工作。

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

直接赋值的情况有什么问题?

这与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> 不会 自动转换为 转换为 I<object>I<dynamic>。我找不到在语言参考中指定的位置。

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