「Func test = value ? F: F" はコンパイルされない? 質問する

「Func test = value ? F: F

これと似たような質問を見たことがありますが、それらは異なる種類のものなので、これは新しい質問だと思います。

次のコードを考えてみましょう。

public void Test(bool value)
{
    // The following line provokes a compiler error:
    // "Type of conditional expression cannot be determined because there is 
    // no implicit conversion between 'method group' and 'method group".

    Func<bool> test = value ? F : F;
}

public bool F()
{
    return false;
}

さて、C# 3.0標準によれば、

?:演算子の2番目と3番目のオペランドは条件式の型を制御します。XとYを2番目と3番目のオペランドの型とします。

X と Y が同じ型の場合、これが条件式の型になります。それ以外の場合、X から Y への暗黙的な変換 (§6.1) が存在するが、Y から X への暗黙的な変換は存在しない場合、Y が条件式の型になります。それ以外の場合、Y から X への暗黙的な変換 (§6.1) が存在するが、X から Y への暗黙的な変換は存在しない場合、X が条件式の型になります。それ以外の場合、式の型を判別できず、コンパイル時エラーが発生します。

私のサンプルコードでは、XとYは同じエンティティなので、同じ型である必要があるようです。機能では、なぜコンパイルされないのでしょうか?

ベストアンサー1

質問は大幅に変更されたため、私の当初の回答は今では少しずれています。

ただし、問題は本質的に同じです。つまり、 と には一致するデリゲート宣言がいくつでも存在する可能性がありますFが、2 つの同一のデリゲート宣言間には暗黙的な変換がないため、 の型Fを に変換することはできませんFunc<bool>

同様に、あなたが宣言するならば

private delegate void X();
private delegate void Y();
private static void Foo() {}

できない

X x = Foo;
Y y = x;

元の回答:

メソッド グループは暗黙的に型指定された変数に割り当てることができないため、機能しません。

var test = Func;動作しません。

その理由は、 には任意の数のデリゲート型が存在する可能性があるからですFunc。たとえば、 はFuncこれらの宣言の両方に一致します ( に加えてAction)

private delegate void X();
private delegate void Y();

メソッド グループで暗黙的に型指定された変数を使用するには、キャストによって曖昧さを排除する必要があります。


見るアーチルの答えのためにコンクリートこれを修正する 1 つの方法の例。つまり、修正されたコードがどのようになるかを示しています (一致させたいデリゲートが であると仮定Action)。

おすすめ記事