对相同类型的 Funcs 使用三元运算符需要转换
Using ternary operator for Funcs of the same type needs casting
我有这个问题:
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;
}
但是我收到这个错误:
Error 42 Type of conditional expression cannot be determined because there is no implicit conversion between 'method group' and 'method group'
但是如果我这样做:
Func<string, string> transformer = isRTF ? (Func<string, string>) ToRTF : (Func<string, string>) ToHTML;
它工作正常,ReSharper 开始抱怨转换是多余的。
有人知道为什么会这样吗?
这是因为双方都需要从方法组*到Func<string,string>
的转换。编译器有规则可以根据给定给另一方法组的类型推断一个方法组的类型,但是对于 :
两边都有方法组的情况没有规则。
您可以只在一侧进行转换,让编译器为您推断另一侧。您还可以使用 var
进行声明以避免重复类型:
var transformer = isRTF ? new Func<string,string>(ToRTF) : ToHTML;
* 委托的隐式定义中使用的方法名被视为方法组,因为单个名称可以表示多个重载方法。
我知道这个问题已经回答了,我觉得回答的很好很正确。尽管如此,我前一段时间遇到了同样的问题,我为解决这个问题所做的工作是从方法本身 return 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();
我知道这需要更改方法的签名并且不能直接解决问题,但至少您不需要强制转换。
希望对您有所帮助
我有这个问题:
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;
}
但是我收到这个错误:
Error 42 Type of conditional expression cannot be determined because there is no implicit conversion between 'method group' and 'method group'
但是如果我这样做:
Func<string, string> transformer = isRTF ? (Func<string, string>) ToRTF : (Func<string, string>) ToHTML;
它工作正常,ReSharper 开始抱怨转换是多余的。
有人知道为什么会这样吗?
这是因为双方都需要从方法组*到Func<string,string>
的转换。编译器有规则可以根据给定给另一方法组的类型推断一个方法组的类型,但是对于 :
两边都有方法组的情况没有规则。
您可以只在一侧进行转换,让编译器为您推断另一侧。您还可以使用 var
进行声明以避免重复类型:
var transformer = isRTF ? new Func<string,string>(ToRTF) : ToHTML;
* 委托的隐式定义中使用的方法名被视为方法组,因为单个名称可以表示多个重载方法。
我知道这个问题已经回答了,我觉得回答的很好很正确。尽管如此,我前一段时间遇到了同样的问题,我为解决这个问题所做的工作是从方法本身 return 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();
我知道这需要更改方法的签名并且不能直接解决问题,但至少您不需要强制转换。
希望对您有所帮助