不知何故,下面的代碼不會在VS2010中編譯,而是在VS2012中編譯而不做任何更改。在VS2010有問題的線路是爲什麼不使用.NET 4.0在VS2010中編譯此代碼?
names.Select(foo.GetName)
錯誤CS1928:「串[]」不包含「選擇」 System.Linq.Enumerable.Select < TSource,TResult定義和最佳擴展方法過載」 >(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:沒有 - 代碼是爲我編譯的,*不*創建一個額外的方法。嘗試一下:) –