我确信这与这里发生的内容有关。希望有人可以澄清。
我正在访问一个C#友好的库。
我有一个充当数组的特定对象(它是来自lib的用户定义类型)。在C#中我可以打电话。
myObject[0] = 1
我这样做没有错误。
如果我尝试在F#中执行以下操作,我会收到错误 - The expression was expected to have type float32 but instead has type int.
myObject.[0] <- 1
这很有效。
myObject.[0] <- float32 1
所以问题是,为什么在C#中这种类型转换是自动发生的,而在F#中则不然?在F#中我可以做些什么来清理这样的东西吗?
答案 0 :(得分:4)
F#类型检查机制在很多方面比C#中的类型检查更严格。其中一个方面是F#不会在幕后进行任何隐式转换,因此您必须使用正确的数字文字(如1.0f
)或显式转换函数(如float32
)。
为什么语言是这样设计的?一个原因是它使类型推断更简单,更可预测。例如:
let data = [| 0; 1; 2 |]
let writeData n =
data.[0] <- n
这里,F#编译器知道data
的类型为int[]
(因为它被初始化为包含整数的数组)。它还知道writeData
是函数int -> unit
,因为数组包含整数,因此n
也必须是整数。
如果编译器进行了隐式转换,那么会有很多不确定因素:
data
可以是float[]
或float32[]
,因为您可以隐式将整数转换为其他数字类型dwriteData
可以使用任何可转换为int
的数字类型(例如int16
,sbyte
等。)这会使类型信息变得更复杂,并且您可能必须更频繁地明确指定类型。出于这个原因,F#选择权衡 - 你必须明确地编写转换,但是你不需要经常使用类型注释。