将一些C#泛型代码重写为F#

将一些C#泛型代码重写为F#,c#,generics,f#,C#,Generics,F#,我正试图像这样重写通用代码(C#): uupcast(tx),其中T:U{returnx;} 在F#中: 让ucast(x:'T)=x:>'U 但F#约束求解的工作原理与C#不同,编译器会输出一系列键入错误: 错误FS0698:无效约束:错误 用于约束的类型为 密封,这意味着约束 最多只能满足一个 解决方案 警告FS0064:此构造导致 代码的通用性要低于所示 通过类型注释。类型 变量“T”已被约束为 输入“U” 错误FS0663:此类型参数具有 以限制它的方式使用 永远是“你” 错误FS0

我正试图像这样重写通用代码(C#):

uupcast(tx),其中T:U{returnx;}
在F#中:

让ucast(x:'T)=x:>'U
但F#约束求解的工作原理与C#不同,编译器会输出一系列键入错误:

错误FS0698:无效约束:错误 用于约束的类型为 密封,这意味着约束 最多只能满足一个 解决方案

警告FS0064:此构造导致 代码的通用性要低于所示 通过类型注释。类型 变量“T”已被约束为 输入“U”

错误FS0663:此类型参数具有 以限制它的方式使用 永远是“你”

错误FS0013:来自的静态强制 键入“U到”U
涉及不确定的基于类型的 关于本课程之前的信息 指向静态强制并不适用 在某些类型上允许。进一步类型 需要注释

错误FS0661:一个或多个 显式类或函数类型 无法找到此绑定的变量 可以概括,因为它们是 约束到其他类型


请告诉我如何正确重写上面的C代码,以及为什么我编写的F版本不能编译。

这是编译器的限制。约束“a:>”b的正确类型必须是非泛型类型。

不能为此编写类型安全函数。但是,您可以使用运算符而不是函数。

这在F#中是不可能的。见和

U Upcast<T, U>(T x) where T : U { return x; }
let ucast<'T, 'U when 'T :> 'U> (x: 'T) = x :> 'U