c# – 使用三元语句将扩展方法分配给委托

假设

假设我们有一个接口,并为所述接口定义了以下扩展方法(它们的实现并不重要)

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>’

点赞