2011-02-26 62 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);