使用分配代理时出错?: 句法

Jon*_*ood 4 c# delegates method-group

我已经创建了一个委托和两个匹配的方法.

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));
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下语法将这些方法中的任何一个分配给委托时(请注意,此代码位于同一类的静态方法中):

CharComparer isEqual = (ignoreCase) ? CharCompareIgnoreCase : CharCompare;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

无法确定条件表达式的类型,因为"方法组"和"方法组"之间没有隐式转换

我可以使用常规if ... else语句来完成这项任务,它工作得很好.但我不明白为什么我不能使用更紧凑的版本,我不明白错误信息.有谁知道这个错误的含义?

Guf*_*ffa 7

条件运算符中的类型在赋值之前被解析,因此编译器不能使用赋值中的类型来解析条件运算符.

只需转换其中一个操作数,CharComparer以便编译器知道使用该类型:

CharComparer isEqual = ignoreCase ? (CharComparer)CharCompareIgnoreCase : CharCompare;
Run Code Online (Sandbox Code Playgroud)

  • 我认为问题是`CharCompareIgnoreCase`的类型是`CharCompareIgnoreCase`,而不是`CharComparer`.它转换为`CharComparer`,但实际上并不是那种类型.因此,编译器会看到,并尝试将`CharCompare`强制转换为`CharCompareIgnoreCase`,这显然会失败.通过强制转换为`CharCompare`,编译器会"哦,好吧".并接受类型为`CharCompare`. (2认同)