Eri*_*ric 3 primitive f# types casting
我已经使用自定义F#类型设计了我的应用程序域,但是现在看来,当我要实际将数据用于各种任务时,这些自定义类型将成为PITA,例如,使用其他库将值写入CSV文件依靠原语等
例如,我有一个像这样的自定义类型(用作其他较大类型的构造块):
type CT32 = CT32 of float
Run Code Online (Sandbox Code Playgroud)
但是这样的代码不起作用:
let x = CT32(1.2)
let y = float x //error: The type "CT32" does not support a conversion...
let z = x.ToString() //writes out the namespace, not the value (1.2)
Run Code Online (Sandbox Code Playgroud)
我尝试使用box / unbox和Convert.ToString()以及两个F#强制转换运算符,但是似乎没有一个允许我访问类型所包含的基本基本值。是否有一种简单的方法来获取自定义类型中的原始值,因为到目前为止,它们比实际使用的更令人头疼。
添加对的支持float很简单:
type CT32 = CT32 of float with
static member op_Explicit x =
match x with CT32 f -> f
let x = CT32(1.2)
let y = float x
Run Code Online (Sandbox Code Playgroud)
你们type CT32是一个受歧视的工会,只有一个案件标识符CT32 of float。它不是alias浮动类型,因此您不能将其强制转换为浮动。要从中提取值,您可以使用模式匹配(这是最简单的方法)。
type CT32 = CT32 of float
let x = CT32(1.2)
let CT32toFloat = function CT32 x -> x
let y = CT32toFloat x
let z = y.ToString()
Run Code Online (Sandbox Code Playgroud)
作为替代方案(如果您的自定义类型是数字),您可以使用度量单位https://msdn.microsoft.com/en-us/library/dd233243.aspx 它们没有运行时开销(我相信有区别的联合是编译的到类),但在编译时提供类型安全。
| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |