我有一个名为'Pane'的课程(想想玻璃窗格),它实现了IPane:
type IPane =
abstract PaneNumber : int with get, set
abstract Thickness : float<m> with get, set
abstract ComponentNumber : int with get, set
abstract Spectra : IGlassDataValues with get, set
...
type Pane(paneNumber, componentNumber, spectra, ...) =
let mutable p = paneNumber
let mutable n = componentNumber
let mutable s = spectra
...
interface IPane with
member this.PaneNumber
with get() = p
and set(value) = p <- value
member this.ComponentNumber
with get() = n
and set(value) = n <- value
member this.Spectra
with get() = s
and set(value) = s <- value
...
Run Code Online (Sandbox Code Playgroud)
我创建了一个窗格列表(窗格列表):
let p = [ p1; p2 ]
Run Code Online (Sandbox Code Playgroud)
但是我需要将它转换为IPane列表,因为这是另一个函数中的参数类型.以下代码生成错误:
let p = [ p1; p2 ] :> IPane list
'Type constraint mismatch. The type
Pane list
is not compatible with type
IPane list
The type 'IPane' does not match the type 'Pane'
Run Code Online (Sandbox Code Playgroud)
当Pane实现IPane时,这很令人困惑.只需将Pane list对象作为参数传递给所需的函数也会产生错误.
如何将窗格列表转换为IPane列表?
F#不允许以你想要的方式继承.
更好的方法是使用:
[p1 ;p2] |> List.map (fun x -> x:> IPane)
Run Code Online (Sandbox Code Playgroud)
或者,您可以将功能更改为使用此类功能
let f (t:#IPane list) = ()
Run Code Online (Sandbox Code Playgroud)
在这里你可以做f [p1;p2]的#告诉编译器,从继承的任何类型IPane的罚款.