おそらく以下のアダプタの例を知っている:静的に解決のタイプは
type Cat() =
member this.Walk() = printf "Cat walking"
type Dog() =
member this.Walk() = printf "Dog walking"
let inline walk (animal : ^T) =
(^T : (member Walk : unit -> unit) (animal))
let cat = new Cat()
let dog = new Dog()
walk cat
walk dog
徒歩の異なるバージョンが猫と犬クラスの静的にコンパイルされます。
type Cat = { Name : string }
type Dog = { Name : string }
let inline showName (animal : ^T) =
let name = (^T : (member Name : string) (animal))
printf "%s" name
let cat = { Name = "Miaou" } : Cat
let dog = { Name = "Waf" } : Dog
showName cat
showName dog
が、私は、次のコンパイルエラーを取得:
は、それから私は、次のことを試してみましたクラスの猫のために
The type 'Dog' does not support any operators named 'get_Name'
と同じように。
しかし、両方のレコードに対して生成されたクラスを調べると、実際に生成されたNameプロパティのget_Nameメソッドが含まれています。
静的に解決されたジェネリックのレコードフィールドにアクセスする構文が異なりますか、それともF#コンパイラの制限ですか?
行うことができます。私はこれについても興味があります。 –