以下の収率推論された型制約
この構築物は、型注釈で示されるよりも、一般的なように、コードの原因を理解しようとしています。型変数 'P'は型 'bool'に制約されています。
let myValue =
式の右辺のため
、及び
このコードは明示的な型変数「P」が一般化できなかったため、その注釈によって必要とされるよりも少ない総称です。それは「ブール」に制限されていた。
Value
方法で、一般的な<'P>
ため
:
type MyTypeA<'T> (myObject : 'T) as this =
let myValue = this.Value<bool> "SomeBooleanProperty"
member this.Value<'P> name = typeof<'T>.GetProperty(name, typeof<'P>).GetValue(myObject, null) :?> 'P`
しかし、これはうまくコンパイルし、何の警告やエラーを生成しません:
type MyTypeB<'T> (myObject : 'T) as this =
member this.Value<'P> name = typeof<'T>.GetProperty(name, typeof<'P>).GetValue(myObject, null) :?> 'P
member this.Method<'P> name = this.Value<'P> name
ここでは、何が起こっていますか?最初の例では、メソッドがプライベート値の割り当てでは認識されるが、合法的な汎用メソッドとして認識されないのはなぜですか?
コンパイラのようにここに一般化する必要がありますが、何らかの理由でではありません –
@JohnPalmerの楽しい事: ''を削除するとすぐになります - これは仕様やバグのどこかに隠されている境界ケースの1つです –
Carsten
値を変更可能にする場合、 'let myableValue:bool = false'を置き、メソッドの後に' member this.myValue = this.Value "SomeBooleanProperty"を置きます。これを前に置くとエラーになります。仕様にジェネリックスの言及がないので、コーナーケースのバグであるようです。 –
jpe