2011-02-26 60 views
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; 

我得到的错误:

Type of conditional expression cannot be determined because there is no implicit conversion between 'method group' and 'method group'

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

回答

7

在有条件的经营者的类型分配之前得到解决,所以编译器不能使用该类型的任务,以解决条件运算符。

只投其中一个操作数以CharComparer让编译器知道要使用该类型:

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

嘛,那肯定修复它。但是我仍然没有看到条件运算符的类型与赋值类型有什么关系。 –

+1

@Jonathan:编译器需要解析'x? y:z'表达式* first *,然后才可以查看分配。在你的例子中,它不能做到这一点。 – Timwi

+2

我认为问题是'CharCompareIgnoreCase'的类型是'CharCompareIgnoreCase',而不是'CharComparer'。它转换为'CharComparer',但实际上不是那种类型。所以,编译器看到了这一点,并试图将'CharCompare'强制转换为'CharCompareIgnoreCase',这显然失败了。通过强制将Cast转换为“CharCompare”,编译器执行“哦,好吧。”并接受类型为'CharCompare'。 –

2

尝试以下操作:

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