2016-07-06 10 views
0

第1式と第3式はなぜ動作しますが、2式は動作しません。ラムダ式の戻り値型の問題

var ss = new Func<int>(() => 0); 

 var ss = new Func<int>(() => 0); //works 
     int x1 = new Func<int>(() => 0); //doesn't work --Cannot convert source type 'System.Func<int>' to target type 'int' 
     int x2 = new Func<string,int>((x) => 0)(""); //works 
+5

基本的に、 'Func 'を 'int'型の変数に入れようとしています。何か間違っている;) – Sehnsucht

+0

'int x1 = new Func (()=> 0)();'は、関数式を呼び出して0の結果を得た後、それをintに代入することで動作します。しかし、実際には返り値とはあまり関係ありません。また、varに何かを割り当てることができるので、最初の動作が注目されます。 3番目の関数は、関数式(特に期待どおりの文字列)を呼び出すためです。 –

+0

@TravisJ 'var'には何も置くことはできません。式から型を(静的に)決めることができる "唯一の"ものです。たとえば、 'var foo = delegate(){return 0; }; 'うまくいきません。 – Sehnsucht

答えて

8

コンパイラが正しくFunc<int>するssの実際の型を推測することができます。 Func<int>は、呼び出すことができるデリゲートであり、intを返します。だから、私たちがリターンintにために(例えばss())ここssを起動する必要がありました

ss() == 0 // is true 

注意してください。ですから、今のように型指定された変数に(以前のものと同じ)機能/デリゲートを保存しようとしているため、次は

int x1 = new Func<int>(() => 0); 

右することはできません、私たちは上から何をすべきかを知って

int。それはタイプFunc<int> ...の代理人です。intとはまったく異なります。呼び出されると、intが返されます。

すぐに(パラメータとして使用されていない空の文字列、""供給)を呼び出し、その後、パラメータとして文字列を受け取り、intを返す関数を宣言している

int x2 = new Func<string,int>((x) => 0)(""); 

この場合。この関数はintを返し、次にx2に対して格納します。

今より意味がありますか?

+0

はい!それは私が理解していなかった呼び出し部分です。だから、最もきれいな方法は次のようになります:int x1 = new Func (()=> 0)();代入には2つの部分があります - ラムダ式とそれを呼び出すことは実際にfunc.を実行し、返されるものを返します。 非常に高く評価されています。 – Chris

0

は、あなたが、これがまた同じエラーを返します、わかりますので、のような、

int x1 = new Func<int, int>(() =<0); 

、あなたのFuncの戻り値の型を追加しようとしています。

varは、varの値は型に関係なく使用できます。 C#は強く型付けされており、intの場合、Funcは値のタイプがintであると予想しています。