我想知道是否有可能,因为我的5分钟实验证明没有结果。
我希望它会像以下一样简单:
T Identity<T>(T t) { return t; }
但是这无法在采用Func参数的泛型方法上进行编译。例如OrderBy。甚至指定类型参数(这正是我想要避免的!),它无法编译。
接下来,我尝试了一些我认为可行的方法:
Func<T, R> MakeIdentity<T, R>()
{
return (T t) => (R)(object)t;
}
也没有去:((这在应用类型参数时编译,再次,不是我想要的)
有没有人做过这样的运气?
更新:请不要说:x =&gt; x,我知道,这很明显!我要求的是一个函数,而不是表达式:))
更新2:当我提到身份时,我的意思是在功能意义上,函数只返回传递给它的同一个对象。它可能是我遇到的每种功能语言,但那些不使用静态类型。我想知道如何使用泛型来做这个(如果可能的话)。只是为了好玩!
更新3:这是基于第二个想法的部分“解决方案”:
Expression<Func<T, T>> MakeIdentity<T>()
{
return t => t;
}
void Foo(string[] args)
{
var qargs = args.AsQueryable();
var q = qargs.OrderBy(MakeIdentity<string>());
...
}
我认为除此之外的任何事情都不可能。
答案 0 :(得分:3)
由于host方法和input方法都是通用的,因此类型推断不起作用。要做到这一点,你必须写
myList.OrderBy<int, int>(Identity);
或者
myList.OrderBy((Func<int, int>)Identity);
答案 1 :(得分:2)
这对我来说非常适合我到目前为止所需的地方。
<!--
Images of arrows pointing Right and left
arrow right: Onclick function changeImageUp() +1 to each DIV ID
arrow left: Onclick function changeImageDown() -1 to each DIV ID
-->
<div id="right" value="right" onclick="changeImageUp();"><image src="images/GroupArrow/right.png" /></div>
<div id="left" value="left" onclick="changeImageDown();"><image src="images/GroupArrow/left.png" /></div>
<!--
Group name is set to 0
Position name is set to 0
ID name is set to 0
-->
Group:<div id="Groupcounter" name="0"></div>
Position:<div id="Poscounter" name ="0"></div>
ID: <div id="IdNum" name="0"></div>
答案 2 :(得分:1)
您遇到的问题是C#中的匿名函数和方法组不参与类型推断。必须给出明确的类型。
你可以做的是拥有匿名功能的身份功能。实施例
Func<T> IdentityFunc1<T>(Func<T> func) { return func; }
我不完全确定您使用第二个样本得到了什么。你能详细说明吗?
答案 3 :(得分: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);
}
}