他の人は、あなたが意味した可能性のあるデリゲート型が無限にあることをすでに指摘しています。またはその他の可能性Func
ではなく、デフォルトに値するほど特別なものは何ですか? また、ラムダの場合、意図が式ツリー形式ではなくデリゲート形式を選択することであることが明らかなのはなぜでしょうか?Predicate
Action
しかし、それFunc
は特別なことであり、ラムダまたは匿名メソッドの推論された型は何かの Func であると言えます。私たちはまだあらゆる種類の問題を抱えているでしょう。次の場合、どのタイプを推測しますか?
var x1 = (ref int y)=>123;
Func<T>
ref何かを取るタイプはありません。
var x2 = y=>123;
戻り値はわかっていますが、仮パラメータの型はわかりません。(または、戻り値は int ですか? long ですか? short ですか? byte ですか?)
var x3 = (int y)=>null;
戻り値の型はわかりませんが、void にすることはできません。戻り値の型は、任意の参照型または null 許容値型にすることができます。
var x4 = (int y)=>{ throw new Exception(); }
繰り返しますが、戻り値の型はわかりません。今回はvoidになる可能性があります。
var x5 = (int y)=> q += y;
これは、void を返すステートメント ラムダまたは q に割り当てられた値を返すものを意図したものですか? どちらも合法です。私たちはどれを選ぶべきですか?
さて、これらの機能はどれもサポートしていないと言うかもしれません。タイプを解決できる「通常の」ケースをサポートするだけです。それは役に立ちません。それは私の人生をどのように楽にしてくれますか? 機能が時々機能し、時々失敗する場合でも、それらすべての失敗状況を検出し、それぞれに意味のあるエラー メッセージを表示するコードを作成する必要があります。すべての動作を指定し、文書化し、テストを作成する必要があります。これは非常に高価な機能であり、ユーザーはおそらく半ダースのキーストロークを節約できます。言語に価値を付加するには、機能の半分の時間しか機能せず、機能する場合にほとんどメリットがない機能のテスト ケースを書くのに多くの時間を費やすよりも優れた方法があります。
実際に役立つ状況は次のとおりです。
var xAnon = (int y)=>new { Y = y };
そのことには「話せる」タイプがないからです。しかし、私たちは常にこの問題を抱えており、メソッドの型推論を使用して型を推測しています。
Func<A, R> WorkItOut<A, R>(Func<A, R> f) { return f; }
...
var xAnon = WorkItOut((int y)=>new { Y = y });
これで、メソッド型の推論により、func 型が何であるかがわかります。