使用? :语法分配委托出错

4
我已创建了一个委托和两个相应的方法。
private delegate bool CharComparer(char a, char b);

// Case-sensitive char comparer
private static bool CharCompare(char a, char b)
{
    return (a == b);
}

// Case-insensitive char comparer
private static bool CharCompareIgnoreCase(char a, char b)
{
    return (Char.ToLower(a) == Char.ToLower(b));
}

当我尝试使用以下语法(请注意,此代码位于同一类的静态方法中)将其中任何一个方法分配给委托时:
CharComparer isEqual = (ignoreCase) ? CharCompareIgnoreCase : CharCompare;

我遇到了一个错误:

由于'method group'和'method group'之间没有隐式转换,无法确定条件表达式的类型

我可以使用常规的if...else语句进行分配,它可以正常工作。但是我不明白为什么不能使用更简洁的版本,并且我也不理解这个错误消息的含义。有人知道这个错误的含义吗?

2个回答

7

条件运算符中的类型在赋值之前就已经确定,因此编译器无法使用赋值中的类型来解析条件运算符。

只需将操作数之一强制转换为CharComparer,以便编译器知道要使用该类型:

CharComparer isEqual = ignoreCase ? (CharComparer)CharCompareIgnoreCase : CharCompare;

好的,那肯定解决了问题。但我仍然不明白条件运算符的类型与赋值的类型有什么关系。 - Jonathan Wood
1
@Jonathan:编译器需要首先解析x ? y : z表达式的类型,然后才能查看赋值。在您的示例中,它无法执行此操作。 - Timwi
2
我认为问题在于CharCompareIgnoreCase的类型是CharCompareIgnoreCase,而不是CharComparer。它进行强制类型转换到CharComparer,但实际上并不是那种类型。因此,编译器会看到这一点,并尝试将CharCompare强制转换为CharCompareIgnoreCase,显然会失败。通过强制将Cast转换为CharCompare,编译器就会接受类型作为CharCompare - Mike Caron
我猜这是因为CharCompareIgnoreCase不会自动转换为CharComparer类型。只有当我将它分配给该类型的委托或进行类型转换时,它才会成为该类型。 - Jonathan Wood
@Mike:没错,我在看到你的评论之前就写了上面那条。是的,那似乎是问题所在。谢谢。 - Jonathan Wood
这是完全正确的。只要有人学到了东西,就是好的。 - Mike Caron

2
尝试以下操作:

CharComparer isEqual = (ignoreCase) ? new CharComparer(CharCompareIgnoreCase) : new CharComparer(CharCompare);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接