9

どういうわけか、次のコードは VS2010 ではコンパイルされませんが、VS2012 では変更なしでコンパイルされます。VS2010で問題のある行は

names.Select(foo.GetName)

エラー CS1928: 'string[]' には 'Select' の定義と最適な拡張メソッド オーバーロード '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;
        }
    }
}
4

4 に答える 4

3

更新された回答

コード スニペットnames.Select(foo.GetName)が VS 2012 でコンパイルされ、VS2010 ではコンパイルされないことを確認しました。

それを可能にした理由 (正確には、C# 5.0 または .NET 4.5 または新しい API の新機能) はわかりません。

しかし、エラーに続いて

The type arguments for method 'System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TResult>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Enumerable.Selectのパラメーターと戻り値の型を推測できないようですfoo.GetName

タイプを指定すると、コードがコンパイルされます。

次の 3 つのオプション

1. キャスト先Func<string,string>

string.Join(", ", names.Select<string,string>(foo.GetName).ToArray())

2. Select句 で型をジェネリック パラメータとして指定する

string.Join(", ", names.Select((Func<string,string>)foo.GetName).ToArray())

3. 匿名デリゲートで Function を明示的に呼び出します。

 Console.WriteLine(string.Join(", ", names.Select( name => foo.GetName(name))))

しかし、Jon Skeet がコメントで指摘したように、上記は新しいメソッドを作成することによって別の関数呼び出しを追加します。

元の回答

このコードが .NET 4.0 を使用する VS2010 でコンパイルされないのはなぜですか?

パラメータを名前に渡していません。の代わりにメソッド名を渡していFunc<T1,T2>ます。


以下はコンパイルされます

Console.WriteLine(string.Join(", ", names.Select( name => foo.GetName(name))))
于 2013-01-14T14:41:46.920 に答える
0
using System;
using System.Linq;

namespace ConsoleApplication1
{
    public static class Program
    {
        public static void Main()
        {
            Foo foo = new Foo();
            String[] names = new String[] { "Hello" };

            Console.WriteLine(String.Join(", ", names.Select(name => foo.GetName(name))));
        }
    }

    public class Foo { }

    public static class Extensions
    {
        public static String GetName(this Foo foo, String name)
        {
            return name;
        }
    }
}
于 2013-01-14T14:53:46.887 に答える