Мне было интересно, возможно ли это, поскольку мои 5 минут экспериментов оказались бесплодными.
Я надеялся, что это будет так же просто, как:
T Identity<T>(T t) { return t; }
Но это не скомпилируется в универсальных методах, принимающих параметры Func. Например, OrderBy. Даже при указании параметров типа (а это именно то, чего я хочу избежать!), Он не компилируется.
Затем я попробовал что-то, что, как я думал, будет работать:
Func<T, R> MakeIdentity<T, R>()
{
return (T t) => (R)(object)t;
}
Также не идти :( (это компилируется при применении параметров типа, опять же, не то, что я хочу)
Кто-нибудь имел счастье сделать такую вещь?
ОБНОВЛЕНИЕ: пожалуйста, не говорите: х => х, я знаю, это очевидно! Я прошу функцию, а не выражение:)
ОБНОВЛЕНИЕ 2: Когда я ссылаюсь на тождество, я имею в виду функциональный смысл, когда функция просто возвращает тот же объект, который вы ей передали. Это возможно на каждом функциональном языке, с которым я сталкивался, но они не используют статическую типизацию. Мне интересно, как это сделать (если это возможно) с генериками. Просто для удовольствия!
ОБНОВЛЕНИЕ 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>());
...
}
Я не думаю, что будет возможно что-то большее, чем это.