用于类型推断的通用标识函数

时间:2009-02-19 15:13:48

标签: c# generics identity functional-programming type-inference

我想知道是否有可能,因为我的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>());
  ...
}

我认为除此之外的任何事情都不可能。

4 个答案:

答案 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);
   }
}