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.这是正确的吗?
然后如何解决这些问题?
我不清楚你想要实现什么,但你可以使用包含泛型方法的非泛型接口来实现:
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方法,你会说"这是一个可以以类型安全的方式应用于任何类型的函数".
但是,没有办法将该接口表示为委托类型.