doe*_*man 19 c# generics delegates
将方法分配给Func-type时,我得到编译错误Type of conditional expression cannot be determined because there is no implicit conversion between 'method group' and 'method group'.
这只发生在? :操作员身上.代码:
public class Test
{
public static string One(int value)
{
value += 1;
return value.ToString();
}
public static string Two(int value)
{
value += 2;
return value.ToString();
}
public void Testing(bool which)
{
// This works
Func<int, string> actionWorks;
if (which) actionWorks = One; else actionWorks = Two;
// Compilation error on the part "One : Two"
Func<int, string> action = which ? One : Two;
}
}
Run Code Online (Sandbox Code Playgroud)
我找到了一些关于共同和逆变的信息,但我不知道这是如何适用于上述情况的.为什么这不起作用?
Jon*_*Jon 29
您需要明确提供至少一个方法组的签名.但是,在执行此操作后,编译器将允许您将其声明action为隐式类型的本地:
var action = which ? (Func<int, string>)One : Two;
Run Code Online (Sandbox Code Playgroud)
发生这种情况的原因是,返回类型operator ?:不是基于您尝试将其分配给的,而是基于两个表达式的类型推断出的.如果类型相同或者它们之间存在隐式转换,则编译器会成功推导出返回类型; 否则,它抱怨没有转换.
直接将函数分配给委托时,如果函数与签名匹配,编译器会将该函数转换为所需的委托类型.
但是,当您使用?:运算符时,就编译器而言,您不是直接分配给委托,因此它不知道对于One和Two使用什么类型,因此它认为这两个?:运算符中使用的类型不匹配.
唯一的解决方法是将转换显式化:
Func<int, string> action = which ? new Func<int, string>(One) : new Func<int, string>(Two);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5234 次 |
| 最近记录: |