代码之家  ›  专栏  ›  技术社区  ›  leppie

用于类型推理的泛型标识函数

  •  10
  • leppie  · 技术社区  · 16 年前

    我想知道这是否可能,因为我5分钟的实验证明是没有结果的。

    我希望它能像:

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

    但这并不能在使用func参数的通用方法上编译。Eg OrderBy。甚至指定类型参数(这正是我想要避免的!),无法编译。

    接下来我尝试了一些我认为可行的方法:

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

    同样不执行:(这在应用类型参数时编译,同样,不是我想要的)

    有人做这种事运气好吗?

    更新:请不要说:x=>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 回复  |  直到 9 年前
        1
  •  3
  •   Chaowlert Chaisrichalermpol    16 年前

    类型推断将不起作用,因为宿主方法和输入方法都是泛型的。要做到这一点,你必须写

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

    myList.OrderBy((Func<int, int>)Identity);
    
        2
  •  2
  •   Ostati    9 年前

    在我到目前为止需要它的地方,这对我很有用。

    internal class IdentityFunction<TSource>
    {
        public static Func<TSource, TSource> Instance
        {
            get { return x => x; }
        }
    }
    
    OrderBy(IdentityFunction<Foo>.Instance)
    
        3
  •  1
  •   JaredPar    16 年前

    您遇到的问题是C中的匿名函数和方法组不参与类型推断。必须提供显式类型。

    不过,您可以为匿名函数使用标识函数。例子

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

    我不完全确定你对第二个样本的了解。你能详细解释一下吗?

        4
  •  0
  •   onof    14 年前

    第一个选项对我有效:

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