假设
假设我们有一个接口,并为所述接口定义了以下扩展方法(它们的实现并不重要)
public interface IPerson;
public class IPersonExtensionMethods
{
public static bool SayHello(this IPerson talker, IPerson listener);
public static bool SayGoodbye(this IPerson talker, IPerson listener);
}
问题
我们知道这两种扩展方法基本相同,因为它们接受2个IPerson类型的参数,并返回bool.现在,让我们假设我们要将1个扩展方法分配给Func< IPerson,IPerson,bool>类型的委托.我们可以使用:
Func<IPerson, IPerson, bool> whatShouldWeSay;
if (sayHello)
{
whatShouldWeSay = IPersonExtensionMethods.SayHello;
}
else
{
whatShouldWeSay = IPersonExtensionMethods.SayGoodbye;
}
但是,如果我们将if语句转换为速记,如下所示:
Func<IPerson, IPerson, bool> whatShouldWeSay = (sayHello)
? IPersonExtensionMethods.SayHello
: IPersonExtensionMethods.SayGoodbye;
我们收到编译错误消息:
Type of conditional expression cannot be determined because there is
no implicit conversion between ‘method.group’ and ‘method.group’
题
为什么会出现此错误?是否由于代表的性质是一种扩展方法;或者是由于short-hand if语句如何确定结果类型?还是它完全不同?
最佳答案 发生错误是因为在三元语句中,结果(true和false)都需要是相同的类型.使用常规方法也会发生同样的事情,而不仅仅是扩展方法.您需要将它们转换为目标类型:
Func<IPerson, IPerson, bool> whatShouldWeSay = (sayHello)
? (Func<IPerson, IPerson, bool>)IPersonExtensionMethods.SayHello
: (Func<IPerson, IPerson, bool>)IPersonExtensionMethods.SayGoodbye;
我在三元语句中使用null时遇到过这种情况,将null转换为某种可空类型感觉很奇怪.这可以在这里以更简单的方式显示:
// Doesn't compile
int? a = true ? 10 : null;
// Compiles
int? a = true ? 10 : (int?)null;
我们得到以下编译器错误:
Type of conditional expression cannot be determined because there is no implicit conversion between ‘int’ and ‘<null>’