我正在尝试重写像这样的通用代码(C#):
U Upcast<T, U>(T x) where T : U { return x; }
在F#中:
let ucast<'T, 'U when 'T :> 'U> (x: 'T) = x :> 'U
但是F#约束求解的工作方式与C#不同,编译器会输出一堆输入错误:
错误FS0698:无效约束: 用于约束的类型是 密封,这意味着约束 最多只能满足一个 溶液
警告FS0064:此构造导致 代码不如指示的通用 按类型注释。类型 变量'T已被约束为 输入''U'。
错误FS0663:此类型参数有 以一种限制它的方式使用 总是''U'
错误FS0013:来自的静态强制 输入'U to'U
涉及基于不确定类型 关于此计划之前的信息 点。静态强制不是 允许某些类型。更多类型 需要注释。错误FS0661:一个或多个 显式类或函数类型 这种绑定的变量不能 被推广,因为它们是 约束到其他类型
请解释我如何正确地重写上面的C#代码以及为什么我编写的F#版本没有编译。
答案 0 :(得分:6)
您不能为此编写类型安全的功能。但是,您可以使用upcast
运算符代替函数。
答案 1 :(得分:4)
这在F#中是不可能的。请参阅How do I translate a `where T : U` generic type parameter constraint from C# to F#?和http://cs.hubfs.net/forums/thread/10534.aspx。
答案 2 :(得分:3)
这是编译器限制。正确的约束类型'a:&gt; 'b必须是非泛型类型。