1

假设有一个恒等函数,即:

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

我应该输入F什么?

void F<T>(Func<T, T> f) { // This is not sound!
    System.Console.WriteLine("{0}", f(1));
    System.Console.WriteLine("{0}", f("one"));
}

static void Main() {
    F(Id);
}

我认为 C# 没有 N 级多态性,C# 不能正确输入F。这是正确的吗?

然后如何解决这些问题?

4

1 回答 1

5

我不清楚您要实现什么,但是您可以使用包含通用方法的非通用接口来做到这一点:

using System;

interface IGenericSameTypeFunction
{
    T Apply<T>(T input);
}

public class SimpleIdentityFunction : IGenericSameTypeFunction
{
    public T Apply<T>(T input) => input;
}

class Test
{    
    static void F(IGenericSameTypeFunction function)
    {
        Console.WriteLine(function.Apply(1));
        Console.WriteLine(function.Apply("one"));
    }

    static void Main()
    {
        F(new SimpleIdentityFunction());
    }
}

重要的方面是,通过使Apply方法通用而不是F方法,您是在说“这是一个可以以类型安全的方式应用于任何类型的函数”。

但是,没有办法将该接口表示为委托类型。

于 2017-08-06T08:37:03.130 回答