使用相同库的C#和F#之间的转换差异

时间:2013-03-01 03:46:15

标签: .net f# clr

我确信这与这里发生的内容有关。希望有人可以澄清。

我正在访问一个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#中我可以做些什么来清理这样的东西吗?

1 个答案:

答案 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的数字类型(例如int16sbyte等。)

这会使类型信息变得更复杂,并且您可能必须更频繁地明确指定类型。出于这个原因,F#选择权衡 - 你必须明确地编写转换,但是你不需要经常使用类型注释。