对相同类型的Func使用三元运算符需要进行转换

时间:2017-06-19 14:36:30

标签: c# casting ternary-operator

我有这个问题:

Func<string,string> transformer = isRTF ? ToRTF : ToHTML;

private string ToRTF(string value) {
    //Convert to RTF 
    return value;        
}
private string ToHTML(string value) {
    //Convert to HTML
    return value;    
}

但是我收到了这个错误:

  

错误42无法确定条件表达式的类型,因为&#39;方法组&#39;之间没有隐式转换。和&#39;方法组&#39;

但是,如果我这样做:

Func<string, string> transformer = isRTF ? (Func<string, string>) ToRTF : (Func<string, string>) ToHTML;

它没有问题,ReSharper开始抱怨演员表是多余的。

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:5)

这是因为双方都需要从方法组 * 转换为Func<string,string>。编译器具有从给定给另一个方法组的类型推断一个方法组的类型的规则,但是对于:的双方都有方法组的情况没有规则。

您只能在一方进行转换,让编译器为您推断另一方。您还可以使用var进行声明,以避免重复类型:

var transformer = isRTF ? new Func<string,string>(ToRTF) : ToHTML;

* 在委托的隐式定义中使用的方法名称被视为方法组,因为单个名称可以表示多个重载方法。

答案 1 :(得分:0)

我知道这个问题已得到解答,我认为答案非常好且正确。尽管如此,我前一段时间遇到过同样的问题,而我所做的就是从方法本身返回Func。如下所示:

 private static Func<string,string> A() => (v) => string.Empty;

 private static Func<string,string> B() => (v) => "I am not empty =)";

var myFunc = someBool ? A() : B();

我知道这需要更改方法的签名,并且不能直接解决问题,但至少你不需要强制转换。

希望这有帮助