以下产量
此构造导致代码不像类型注释所指示的那样通用。类型变量' P已被约束为类型' bool'。
表示let myValue =
表达式的右侧,
此代码的通用性低于其注释所要求的,因为显式类型变量' P'无法概括。它被限制为“bool'
。”
表示<'P>
方法中的通用Value
:
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
这是怎么回事?在第一个例子中,为什么在私有值的赋值中识别的方法,而不是合法的通用方法?
答案 0 :(得分:2)
来自 ConstraintSolver.fs 的 SolveTyparEqualsTyp 中的 CheckWarnIfRigid 函数引发警告(FS0064)
。
引发警告后, SolveTyparEqualsTyp 将继续(因为到目前为止没有错误)来解决类型约束。
SolveTyparEqualsTyp 的评论是:
/// Add the constraint "ty1 = ty" to the constraint problem, where ty1 is a type variable.
/// Propagate all effects of adding this constraint, e.g. to solve other variables
在OP的示例中,这会导致成员Value
定义的错误FS0663。其次是错误FS0660。
出于某种原因,我忽略了一些传播。
也许类型推断过于激进。 @jpe和OP的问题下面的其他评论包含更多有趣的线索。