0

在 C# 中,为了访问属性/方法,我可能会向下转换为一个类型,然后访问该属性:

Fruit f = new Banana();
((Banana)f).Peel();

F# 中的等价物是什么?我尝试了以下方法,但输入句点后的智能感知没有给出该Banana类型的任何成员,所以我猜这是无效的。

let f = new Banana()
(f :?> Banana).Peel() 

我知道我可以通过引入一个中间let语句来做到这一点,但我想知道是否有一个衬里。

更新

好的,我试图举一个一般性的例子,但我想我的翻译中有些东西丢失了。我正在使用 Excel 互操作。无论如何,这里是更具体的代码。

(worksheet.Cells.[rowNumber, dateColumn] :?> Excel.Range).<member here>

但它看起来只是智能感知中的一个临时故障,因为今天(重新启动我的计算机后)它似乎工作正常。昨天它只是向我展示了 Equals, GetHashCode, GetType, and ToString. 现在今天,同样的表达方式给了我Excel.Range全班的所有成员。所以我看起来一切都按预期工作。

4

1 回答 1

2

您最初的猜测是正确的,此代码有效:

type Fruit() =
    member me.Test() = printfn "Test"

type Banana() =
    inherit Fruit()
    member me.Peel() = printfn "Peeling !"

let f = new Banana() :> Fruit
(f :?> Banana).Peel()

你没有展示你是如何定义这些类型的,可能你那里有问题。

另请记住,在 F# 中,您必须明确地向上转换。在您的示例中,您的f对象已经是 a Banana,您的代码中没有任何内容将其向上转换为 a Fruit

于 2013-09-14T06:27:25.563 回答