如何在F#度量单位上定义扩展成员?

如何在F#度量单位上定义扩展成员?,f#,extension-methods,units-of-measurement,F#,Extension Methods,Units Of Measurement,撇开是否应该使用度量单位来表示角度等无单位概念不谈,假设我定义了F中的度和弧度单位# 扩展成员在F#中的度量单位上是否有语法技巧,或者该功能是否受支持?F#扩展成员与C#扩展成员的不同之处在于,您无法定义构造泛型类型的扩展。例如,您可以使用 成员f.平方()=f*f [] m型 设面积=2.0平方() 但是,我看不出这对您的情况有什么帮助…我冒昧地猜测它不受支持。我尝试的所有操作都出现了错误:度量声明可能只有静态成员。问题是度量类型信息在编译后会被删除,因此在运行时,所有操作都只是一个浮点,因

撇开是否应该使用度量单位来表示角度等无单位概念不谈,假设我定义了F中的
弧度
单位#

扩展成员在F#中的度量单位上是否有语法技巧,或者该功能是否受支持?

F#扩展成员与C#扩展成员的不同之处在于,您无法定义构造泛型类型的扩展。例如,您可以使用 成员f.平方()=f*f [] m型 设面积=2.0平方()
但是,我看不出这对您的情况有什么帮助…

我冒昧地猜测它不受支持。我尝试的所有操作都出现了错误:
度量声明可能只有静态成员
。问题是度量类型信息在编译后会被删除,因此在运行时,所有操作都只是一个
浮点
,因此调用实例方法不会产生错误sense@jpalmer. 在编译过程中,扩展成员是静态解析的。@Sebastion Good-确切地说,一旦完成类型检查,额外的类型信息就会被删除,您的代码只是编译成标准
浮点值上的操作,这很有意义。除了语法之外,定义这些扩展方法没有什么真正的好处,还有很多其他的好选择。
type [<Measure>] degree =
    static member ToRadians (d:float<degree>) : float<radian> = d * (Math.PI * 1.<radian>) / 180.0<degree>
and [<Measure>] radian =
    static member ToDegrees (r:float<radian>) : float<degree> = r * 180.0<degree> / (Math.PI * 1.<radian>)
4.0<degree> |> degree.ToRadians
let d = 4.0<degree>
let r = d.ToRadians()
type float<degree> with
    member degrees.ToRadians() = degree.ToRadians(degrees)
error FS0010: Unexpected identifier in type name. Expected infix operator, quote symbol or other token.
type float<[<Measure>]'u> with
    member f.Squared() = f * f

[<Measure>]
type m

let area = 2.0<m>.Squared()