13

このコード フラグメントでは:

List<String> names = new List<String>();
names.Add("Bruce");
names.Add("Tom");
names.Add("Tim");
names.Add("Richard");

names.ForEach(x => Print(x));

private static string Print(string s)
{
    Console.WriteLine(s);
    return s;
}

PrintAction戻ってくるので確実ではありませんstring。しかしx=> Print(x)、なぜですか?

4

3 に答える 3

16

ラムダ式の型は、x => Print(x)そのコンテキストに基づいて決定されます。コンパイラは、ラムダが に割り当てられていることを認識しているため、メソッドの戻り値の型をステートメント式Action<string>であるかのように無視します。Print(s)

これは有効な変換です:

Action<string> myAction = y => Print(y);

言い換えれば、両方

Print("something");

int x = Print("something");

メソッドの正しい使用Print法です。同じ方法でラムダで使用できます。

于 2012-10-13T02:32:32.750 に答える
10

x => Print(x)ここでは、次と同等のメソッドに変換されるラムダです。

void MyPrintLambda(string x) { Print(x); }

コンテキストがたとえば a を要求した場合、次のようFunc<string, string>になります。

string MyPrintLambda(string x) { return Print(x); }

または、それが の場合、次のFunc<string, object>ようになります。

object MyPrintLambda(string x) { return Print(x); }

コンパイラは戻り値の型を無視するだけで (つまり、最初の例) にx => Print(x)変換できるため、コンパイルできます。Action<string>

于 2012-10-13T02:32:40.913 に答える
4

これが有効であるのと同じ理由で:

foreach (string name in names)
{
    Print(name);
}

Print() メソッドはそのコードでも値を返しますが、これがエラーであるとは誰も予想しません。戻り値を捨てるだけでも構いません。

于 2012-10-13T03:07:16.840 に答える