私の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>());
...
}
これ以上のことはできないと思います。