我已经看到一些使用:>
运算符的代码在C#
中完成与 type-casting 类似的内容,但即使我已在网上搜索了很多内容我没见过关于它的文件。
该运算符用于什么?
它是如何运作的?
我在哪里可以找到有关它的文档?
答案 0 :(得分:9)
:>
是向上运营商。它曾用于在层次结构中向上投射,因此它是一种可以在编译时验证的投射。
它的对应:?>
是向下转换运算符,但只能在运行时解决它的成功。
有关详情,请参阅此页:https://msdn.microsoft.com/visualfsharpdocs/conceptual/casting-and-conversions-[fsharp]
答案 1 :(得分:8)
正如@TheInnerLight所解释的那样,:>
运算符表示向上转换。如果您来自C#,这需要一些时间来习惯,因为在C#中,(安全)向上转换和(不安全)向下转换都写为(SomeType)value
。
在F#中,您不需要经常使用:>
,因为编译器会在最常见的位置插入自动向上转换 - 就像C#编译器一样。例如,假设我们foo
需要obj
:
let foo (a:obj) = 0
F#编译器接受以下内容就好了,即使参数是Random
而不是obj
(正如函数foo
所期望的那样):
foo (System.Random())
您可以更明确地编写它,但您不必这样做,因为编译器会插入upcast:
foo (System.Random() :> obj)
您需要显式向上转换的一种情况是从if
或match
构造的不同分支返回不同的值。例如:
if true then obj()
else System.Random()
这不会进行类型检查,但会出现错误:
错误FS0001:此表达式应为
System.Object
类型,但此处的类型为System.Random
您可以通过明确的向上修正来解决此问题:
if true then obj()
else System.Random() :> obj