仮定
インターフェースがあり、そのインターフェースに対して次の拡張メソッドが定義されていると仮定しましょう (それらの実装は重要ではありません) 。
public interface IPerson;
public class IPersonExtensionMethods
{
public static bool SayHello(this IPerson talker, IPerson listener);
public static bool SayGoodbye(this IPerson talker, IPerson listener);
}
問題
IPerson
typeと returnの 2 つのパラメーターを受け入れるという点で、両方の拡張メソッドが基本的に同じであることがわかっていますbool
。ここで、拡張メソッドの 1 つを、Func<IPerson, IPerson, bool>
使用できる型のデリゲートに割り当てたいとします。
Func<IPerson, IPerson, bool> whatShouldWeSay;
if (sayHello)
{
whatShouldWeSay = IPersonExtensionMethods.SayHello;
}
else
{
whatShouldWeSay = IPersonExtensionMethods.SayGoodbye;
}
ただし、if
ステートメントを省略形にすると、次のようになります。
Func<IPerson, IPerson, bool> whatShouldWeSay = (sayHello)
? IPersonExtensionMethods.SayHello
: IPersonExtensionMethods.SayGoodbye;
コンパイル エラー メッセージが表示されます。
「method.group」と「method.group」の間に暗黙的な変換がないため、条件式のタイプを判別できません
質問
なぜこのエラーが発生するのですか? デリゲートが拡張メソッドであるという性質によるものですか。それとも、簡単なif
ステートメントが結果の型をどのように決定するかによるものですか? それとも全然違うものですか?