11

私の5分間の実験は無駄だったので、それが可能かどうか疑問に思っていました.

私はそれが次のように簡単になることを望みました:

T Identity<T>(T t) { return t; }

しかし、これは Func パラメーターを取るジェネリック メソッドでのコンパイルに失敗します。たとえば、OrderBy。型パラメーターを指定しても (これはまさに私が避けたいことです!)、コンパイルに失敗します。

次に、うまくいくと思ったことを試しました:

Func<T, R> MakeIdentity<T, R>()
{
  return (T t) => (R)(object)t;
}

また、行きません:((これは、型パラメーターを適用するときにコンパイルされますが、私が望むものではありません)

そんなものを作って運が良かった人はいますか?

更新: 言わないでください: x => x、私はそれを知っています、それは明らかです! 式ではなく関数を求めています:)

更新 2: ID を参照するときは、機能的な意味で意味します。つまり、関数は、渡されたのと同じオブジェクトを返すだけです。おそらく私が出会ったすべての関数型言語にあると思いますが、それらは静的型付けを使用していません。これを(可能であれば)ジェネリックで行う方法を考えています。楽しみのためだけに!

更新 3: 2 番目のアイデアに基づく部分的な「解決策」は次のとおりです。

Expression<Func<T, T>> MakeIdentity<T>()
{
  return t => t;
}

void Foo(string[] args)
{
  var qargs = args.AsQueryable();
  var q = qargs.OrderBy(MakeIdentity<string>());
  ...
}

これ以上のことはできないと思います。

4

4 に答える 4

3

ホストメソッドと入力メソッドはどちらもジェネリックであるため、型推論は機能しません。これを行うには、次のように書く必要があります

myList.OrderBy<int, int>(Identity);

または

myList.OrderBy((Func<int, int>)Identity);
于 2009-02-19T15:53:56.293 に答える
2

これは、これまで必要としていた場所で機能します。

internal class IdentityFunction<TSource>
{
    public static Func<TSource, TSource> Instance
    {
        get { return x => x; }
    }
}

OrderBy(IdentityFunction<Foo>.Instance)
于 2015-12-01T19:21:09.483 に答える
1

あなたが抱えている問題は、C# の無名関数とメソッド グループが型推論に参加しないことです。明示的な型を指定する必要があります。

あなたができることは、無名関数の Identity 関数を持つことです。例

Func<T> IdentityFunc1<T>(Func<T> func) { return func; }

2 番目のサンプルで何が得られているのか完全にはわかりません。詳しく教えていただけますか?

于 2009-02-19T15:19:48.137 に答える
0

最初のオプションは私にとってはうまくいきます:

public class Foo {

   public Foo(Func<MyObj, MyObj> map) {... }

}

public class Client {

   private static T Identity<T>(T t) { return t; }

   public void main() {
      var foo = new Foo(Identity);

      var c = from f in Enumerable.Range(0, 100) select Identity(f);
      c.ToList().ForEach(System.Console.Out.WriteLine);
   }
}
于 2010-11-23T07:53:32.683 に答える