2010-10-23 62 views
3

我需要指定,我的成员属性将在C#中返回类似dynamic?的内容。在F#中可以使用动态数据类型吗?F#动态选项

type Data = 
    | Text of string 
    | Number of string 
    | Date of string 
    with 

    member x.Value 
     with get() : dynamic option = 
      match x with 
      | Text(value) -> 
       if value.Length > 0 then Some(value) else None 
      | Number(value) -> 
       let (success, number) = Decimal.TryParse value 
       if (success) then Some(number) else None 
      | Date(value) -> 
       let (success, date) = DateTime.TryParse value 
       if (success) then Some(date) else None 

此代码无法编译,因为返回类型从文本案例中确定为string option。 F#中的关键字dynamic未知。有任何想法吗?

+0

你可以'box'但,很可能这是一个设计缺陷。 – 2010-10-23 20:00:59

回答

2

尽量使这个数据类型:

type ThreeWay = S of string | N of Decimal | D of DateTime

,或者使用System.Object类型:

open System 
type Data = 
    | Text of string 
    | Number of string 
    | Date of string 
    with 

    member x.Value 
     with get() : Object option = 
      match x with 
      | Text(value) -> 
       if value.Length > 0 then Some(value :> Object) else None 
      | Number(value) -> 
       let (success, number) = Decimal.TryParse value 
       if (success) then Some(number :> Object) else None 
      | Date(value) -> 
       let (success, date) = DateTime.TryParse value 
       if (success) then Some(date :> Object) else None 

来获取值:

let d = Number("123") 
let v = d.Value 
match v with 
| Some(x) -> x :?> Decimal // <-- TYPE CAST HERE