【发布时间】:2017-08-06 08:31:24
【问题描述】:
假设有一个恒等函数,即:
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。是这样吗?
然后如何解决这些问题?
【问题讨论】:
-
你需要详细说明,很多。确实,您发布的代码不起作用。但是你为什么要让它工作呢?您的“通用”方法仅使用
T来调用f委托。您可以轻松地声明方法void F(Func<object, object> f) { ... },它会起作用。 -
void F(Func<object, object> f) { ... }不是类型安全的。如果F有这样的类型,f可以是string Foo(int v) { return v + ""; }。 -
从表面上看,这似乎是一个关于 C# 语言不支持的功能的学术问题。能给个实际用例吗?
-
我正在尝试将 Sprache(解析器组合库)转换为 CPS,并引用 attoparsec(Haskell 中的解析器组合器)。
标签: c# type-systems rank-n-types