无法将 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
直接赋值的情况有什么问题?
这与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>
不会 自动转换为 转换为 I<object>
或 I<dynamic>
。我找不到在语言参考中指定的位置。
Func<dynamic> h = () => Test2();
在您的代码中起作用的原因是因为它只需要 int
隐式转换为 dynamic
,这很好。它不需要 Func<int>
隐式转换为 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
直接赋值的情况有什么问题?
这与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>
不会 自动转换为 转换为 I<object>
或 I<dynamic>
。我找不到在语言参考中指定的位置。
Func<dynamic> h = () => Test2();
在您的代码中起作用的原因是因为它只需要 int
隐式转换为 dynamic
,这很好。它不需要 Func<int>
隐式转换为 Func<dynamic>
。