これと似たような質問を見たことがありますが、それらは異なる種類のものなので、これは新しい質問だと思います。
次のコードを考えてみましょう。
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
)。