将一些C#通用代码重写为F#

时间:2010-12-30 09:58:27

标签: c# generics f#

我正在尝试重写像这样的通用代码(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#版本没有编译。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

答案 2 :(得分:3)

这是编译器限制。正确的约束类型'a:&gt; 'b必须是非泛型类型。