次のコードは、VS2010ではコンパイルされませんが、VS2012では変更されずにコンパイルされます。 「文字列が[]」「を選択」の定義と最高の拡張メソッドのオーバーロード「System.Linq.Enumerable.Select < TSOURCE、TResultが含まれていません:VS2010での問題の行がなぜこのコードは.NET 4.0でVS2010でコンパイルされませんか?
names.Select(foo.GetName)
エラーCS1928であります>(System.Collections.Generic.IEnumerable <TSource>、System.Func < TSource、TResult >) 'には無効な引数がいくつかあります。
using System;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
var foo = new Foo();
var names = new[] {"Hello"};
Console.WriteLine(string.Join(", ", names.Select(foo.GetName)));
}
}
public class Foo
{
}
static class Extensions
{
public static string GetName(this Foo foo, string name)
{
return name;
}
}
}
まあまあです。それらは等価なコードではありません。あなたのコードはGetNameに委任した新しいメソッドを作成し、そのメソッドを使用してデリゲートを作成しますが、オリジナルはGetNameを直接参照するデリゲートを作成します。 –
@JonSkeet:これがコンパイルする唯一の方法ですね。拡張メソッドはインスタンスメソッドのように見えますが、拡張メソッドはそうではないため、常にそれらのように使うことはできません。 –
@DanielHilgarth:いいえ - コードはそのまま私のためにコンパイルされ、*余分なメソッドを作成しません。あなた自身でそれを試してください:) –