2011-03-08 8 views
2

インデクサーを実装したタイプAがあるとします。タイプAはライブラリです。今、私はそれのインデクサーを拡張したいと思います。ここでは、インデクサーに浮動小数点数を追加します。既存のクラスのインデクサーを拡張する

私は次のコードを働いた:

type A(a:int array) = 
    member this.Item 
    with get(x) = a.[x] 
    and set(x) value = a.[x] <- value 

type A with 
    member m.Item with 
    get(x:float) = m.[x |> int] 
    and set(x:float) v = m.[x |> int] <- v 

をしかし、それは働いていないようです:最後の行については

let a = A([| 1;2;3 |]) 
a.[1] 
a.[1] <- 10 

a.[1.0] 

を、私が取得:

Script1.fsx(243,4): error FS0001: This expression was expected to have type 
    int  
but here has type 
    float  

が可能インデクサーを拡張してF#で?ありがとう!

答えて

2

私はFSIでこれを試しましたが、うまくいくようです。 どのコンパイラを使用していますか? これは私がFSIに供給ものである:タイプ拡張子が別のアセンブリ(又は別のモジュール)で定義されているときは、この異なる挙動この印刷「10」

type A(a:int array) = 
    member this.Item 
    with get(x) = a.[x] 
    and set(x) value = a.[x] <- value 

type A with 
    member m.Item 
     with get(x:float) = m.[x |> int] 
     and set(x:float) v = m.[x |> int] <- v 

let a = A([| 1;2;3 |]) 
a.[1] <- 10 
printfn "%A" a.[1.2] 

5

、それは同じですモジュールを型定義として使用します。

  • 両方が同じモジュール内にある場合、F#は、単一のクラスにそれらをコンパイルし、Itemは、標準的な過負荷のインデクサとなり - この場合は、期待どおりのコードは動作します(これは、あなたが実際にそれをここで書いた方法です) 。

  • 別々のモジュールにある場合、F#は拡張モジュールとしてインデクサーをコンパイルします。この場合、あなたが説明したエラーメッセージが表示されます。

拡張メンバー(新しいメソッドなど)を使用して新しいオーバーロードを追加することは可能です。私の知る限り見ることができる、specificatonが、これはインデクサーのために働くべきではないことを言っていないので、私はそれはバグだと思う(あなたがマイクロソフトドットコムfsbugsに報告することができますか?)

+0

ナイスキャッチ、トマスを倍増、のfloat32です! –

+0

おかげさまでトマース!私はFSharpバグレポートに電子メールを送った。 –

0

エラーの説明には、浮動小数点数を指定して、intを明示的に指定しているので、問題は1.0になります。これを1に置き換えると正常に動作します。

1.0 int型である

1.0Fフロートである別名いくつかの言語で

関連する問題