如何解决C#中的N级多态?

kak*_*n61 1 c# type-systems rank-n-types

假设有一个身份函数,它是:

T Id<T>(T t) { return t; }
Run Code Online (Sandbox Code Playgroud)

我应该输入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);
}
Run Code Online (Sandbox Code Playgroud)

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

然后如何解决这些问题?

Jon*_*eet 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

重要的一点是,通过使Apply方法通用而不是F方法,你会说"这是一个可以以类型安全的方式应用于任何类型的函数".

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