无法确定条件表达式的类型(Func)

将方法分配给Func类型时,我得到编译错误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 actionWorks; if (which) actionWorks = One; else actionWorks = Two; // Compilation error on the part "One : Two" Func action = which ? One : Two; } } 

我找到了一些关于共同和逆变的信息,但我不知道这是如何适用于上述情况的。 为什么这不起作用?

您需要明确提供至少一个方法组的签名。 但是,在执行此操作后,编译器将允许您将action声明为隐式类型的本地:

 var action = which ? (Func)One : Two; 

发生这种情况的原因是, operator ?:的返回类型operator ?:不是基于您尝试将其分配给它的结果推导出来的,而是基于两个表达式的类型。 如果类型相同或者它们之间存在隐式转换,则编译器会成功推导出返回类型; 否则,它抱怨没有转换。

直接将函数分配给委托时,如果函数与签名匹配,则编译器会将该函数转换为所需的委托类型。

但是,当您使用?:运算符时,就编译器而言,您不是直接分配给委托,因此它不知道对于One和Two使用什么类型,因此它认为这两个?:运算符中使用的类型不匹配。

唯一的解决方法是将转换显式化:

 Func action = which ? new Func(One) : new Func(Two); 

Jon的解决方案有效

 var action = which ? (Func)One : Two; 

另一种方法是自己创建一个新的匿名委托。 这在语义上是不同的,但我认为这也很有用。

 Func action = x => which ? One(x) : Two(x); 

我发现这个’更优雅,但不是那么短……