好的,有人可以向我解释为什么 F# 允许您重载 > 和 ^ 运算符,但不允许您使用它们吗?
+ (op_Addition): Works just fine.
^ (op_Concatenate): Compiler error in F#. Apparently only strings can be concatenated.
> (op_GreaterThan): Runtime Error – Failure during generic comparison: the type Program+OppTest4 does not implement the System.IComparable interface.
如果我将 F# 代码编译为库并使用 VB 中的这些运算符,它们都可以工作。如果我使用 C# 中的这些运算符,则除了 op_Concatenate 之外的所有运算符都可以工作(如预期)。但 F# 不仅忽略了其中一些,静态类型检查器甚至懒得告诉您它计划这样做。
Edit代码示例
type OppTest4(value: int) =
member this.value = value
static member (^) (left : OppTest4, right : OppTest4) =
OppTest4( Int32.Parse( left.value.ToString() ^ right.value.ToString() ))
static member (+) (left : OppTest4, right : OppTest4) =
OppTest4(left.value + right.value )
static member (>) (left : OppTest4, right : OppTest4) =
left.value > right.value
static member (<) (left : OppTest4, right : OppTest4) =
left.value < right.value
F# 对这些运算符符号具有适合 F# 的默认含义。您始终可以定义自己的含义来掩盖默认值,例如
let (>) x y = ...
例如,您可以将此运算符定义为“T.operator>(U)”(假设 x 的类型为 T,y 的类型为 U)。
有关默认定义,请参阅源发行版中 FSharp.Core 中的 prim-types.fs。 (它们可不简单!)
考虑到 (1) CLR 上缺乏对类似类型类的机制的支持(用于在一组其他不相关的类型之间定义公共语义)和 (2) 原始类型(如“int”)通常需要针对任何编程语言实现进行特殊处理(例如 System.Int32 没有定义运算符+方法,但大多数编程语言选择表现得好像存在这样的方法),很难想象跨所有语言的任何普遍可互操作的运算符内容今天在.Net 上。有很多设计权衡取决于语言选择做什么(这里总结了太多的交互问题)。无论如何,您应该能够从 F# 调用任何方法,并且如果默认运算符行为不理想,您可以将运算符重新定义(隐藏)为您想要的行为。如果您认为在某种特定情况下您会遇到工作困难,请告诉我。
EDIT
我在以下位置添加了更多详细信息
http://cs.hubfs.net/forums/thread/10869.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)