1

私のプロジェクトでは、複数のタイプを運ぶことができるリストが必要であり、キャストはしたくないので、obj listsを使用してみました。動作するはずのコードの例を次に示しますが、何らかの理由で動作しません。

type Fruit() =
  member this.Kind = "I'm a tasty fruit!"

type Apple() =
  inherit Fruit()
  member this.Kind = "I'm a crispy apple!"

type Cherry() =
  inherit Fruit()
  member this.Kind = "I'm a juicy cherry!"


> (new Fruit()).Kind
val it : string = "I'm a tasty fruit!"

... // And so on; it works as expected for all three fruits

> let aFruit = [new Fruit()]
val aFruit : Fruit list = [FSI_0002+Fruit]

> aFruit.Head.Kind                          // Works just fine
val it : string = "I'm a tasty fruit!"

> let fruits : obj list = [new Fruit(); new Apple(); new Cherry]
val fruits : obj list = [FSI_0002+Fruit; FSI_0002+Apple; FSI_0002+Cherry]

> fruits.Head                               // Okay, so we can extract items just fine. It also kept the property!
val it : obj = FSI_0002+Fruit {Kind = "I'm a tasty fruit!";}

> it.Kind                                   // This doesn't work. Why? What am I missing?
 error FS0039: The field, constructor or member 'Kind' is not defined
4

1 に答える 1

3

問題は、リストがであり、メンバーがないため、itタイプがあることです。親タイプを使用できます-のようにobjobj listobj.Kind

let fruits : Fruit list = [new Fruit(); new Apple(); new Cherry()];;

val fruits : Fruit list = [FSI_0003+Fruit; FSI_0003+Apple; FSI_0003+Cherry]

次に、次のコマンドでアクセスします。

fruits.Head.Kind;;
val it : string = "I'm a tasty fruit!"
于 2012-11-13T02:28:58.070 に答える