4

仮定

インターフェースがあり、そのインターフェースに対して次の拡張メソッドが定義されていると仮定しましょう (それらの実装は重要ではありません) 。

public interface IPerson;

public class IPersonExtensionMethods
{
    public static bool SayHello(this IPerson talker, IPerson listener);
    public static bool SayGoodbye(this IPerson talker, IPerson listener);
}

問題

IPersontypeと 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ステートメントが結果の型をどのように決定するかによるものですか? それとも全然違うものですか?

4

1 に答える 1

2

三項ステートメントでは両方の結果 (true と false) が同じ型である必要があるため、エラーが発生しています。これと同じことが、拡張メソッドだけでなく、通常のメソッドでも発生します。それらをターゲット タイプにキャストする必要があります。

Func<IPerson, IPerson, bool> whatShouldWeSay = (sayHello) 
    ? (Func<IPerson, IPerson, bool>)IPersonExtensionMethods.SayHello
    : (Func<IPerson, IPerson, bool>)IPersonExtensionMethods.SayGoodbye;

三項ステートメントで null を使用するときにこれを少し経験しましたnull。キャストを null 許容型として見るのは非常に奇妙に感じます。これは、次のように簡単に示すことができます。

// Doesn't compile
int? a = true ? 10 : null;

// Compiles
int? a = true ? 10 : (int?)null;

次のコンパイラ エラーが発生します。

'int' と '<null>' の間に暗黙的な変換がないため、条件式の型を特定できません

于 2013-03-28T11:42:19.220 に答える