标题中的错误含糊不清,但谷歌搜索它目前在 SO 上有两次点击,总共有五次点击(表明它是一种罕见的野兽,所以不要指望这里有太多的访问;)。我希望这个问题在该列表中排名第六:p。
Kvb 在此线程中的回答表明错误文本具有误导性,如果您从闭包内调用 base 则会引发错误文本,但情况并非总是如此,因为它有效:
// in a closure, but no FS0419
let myObj = fun foo ->
{ new obj() with override this.ToString() = base.ToString() + foo}
但这失败了(我发现的最简单的例子来说明这个问题):
// not in a closure, but raises FS0419
let myObj =
{ new obj() with override this.ToString() = () |> base.ToString }
我使用对象表达式而不是具有继承的类型声明,并且我尝试通过构建自定义 NUnit 约束来创建新的 FsUnit 约束。这是一个简化版本,显示了我看到的问题:
let EndsWithIgnoreWhitespaceContraint expectedResult =
{ new EndsWithConstraint(expectedResult) with
override __.ApplyTo<'T> (actual: 'T) =
let actual = box actual
if actual :? string then
actual :?> string
|> fun s -> if isNull s then String.Empty else s
|> fun s -> s.Trim()
// error FS0419: 'base' values may only be used to make direct
// calls to the base implementations of overridden members
|> base.ApplyTo
else
exn "String expected .. bla bla..." |> raise }
// make it available to FsUnit's syntax style (overriding existing endWith)
let endWith = EndsWithIgnoreWhitespaceContraint
// using it:
" hello world " |> should endWith "world"
现在,显然不需要知道 FsUnit 就能看到这种行为。但是我花了一夜和一天的时间才意识到我被骗了,事实上,直到我在 SO 上写这个问题时我才看到它。
事实证明这是有效的:
而不是x |> base.SomeMethod
写base.SomeMethod x
。
我觉得这很令人惊讶。不确定这是错误还是功能。但是由于|>
运算符是内联的(我用不同的运算符对其进行了测试)并且它没有创建新函数(就像>>
那样),所以我不明白为什么会引发这个错误。
事实上,我没有看到f a
和之间的任何语义差异a |> f
(除了优先规则等)。那么为什么会出错呢?我违反了什么规则?
最后一个想法,kvb 写道“base
不能从闭包中调用......咖喱成员自动创建一个闭包”,这表明这是错误的,但它编译得很好:
let myObj foo bar =
{ new obj() with override this.ToString() = base.ToString() + foo + bar}
有谁知道究竟是什么原因导致或不导致这个错误?