2011-02-26 27 views
4

私はデリゲートと2つの一致するメソッドを作成しました。私は、次の構文を使用してデリゲートにこれらのメソッドのいずれかを割り当てるしようとすると代理人を使用して代理人を割り当てるエラー? :構文

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 isEqual = ignoreCase ? (CharComparer)CharCompareIgnoreCase : CharCompare; 
+0

まあ、確かにそれを修正します。

ただ、コンパイラはその型を使用することを知っているのでCharComparerにオペランドの1をキャスト。しかし、条件付き演算子のタイプが代入のタイプに関係しているかどうかはまだ分かりません。 –

+1

@Jonathan:コンパイラは、 'x? y:z'式* first *を使って、割り当てを見ることができます。あなたの例では、これを行うことはできません。 – Timwi

+2

私は問題は、 'CharCompareIgnoreCase'は' CharCompareIgnoreCase'であり、 'CharComparer'ではないと思います。これは 'CharComparer'にキャストされますが、実際にはそのタイプではありません。コンパイラはそれを見て、 'CharCompareIgnoreCase'に' CharCompare'をキャストしようとします。これは明らかに失敗します。キャストを 'CharCompare'に強制することにより、コンパイラは「ああ、大丈夫」になります。その型を 'CharCompare'として受け取ります。 –

2

試してみてください。コンパイラは、条件演算子を解決するために割り当てタイプを使用することはできませんので、条件演算子で

CharComparer isEqual = (ignoreCase) ? new CharComparer(CharCompareIgnoreCase) : new CharComparer(CharCompare); 
関連する問題