具有约束的泛型

时间:2014-02-05 07:02:02

标签: f#

type VBO<'T when 'T : (new : unit -> 'T) and 'T : struct and 'T :> ValueType> = 
...

type VAO =
    static member Create(vboList : VBO<'T> list) = 
...

现在我做的时候

val a : VBO<Vector3>
val b : VBO<float>

VAO.Create([a;b])// F# forces vboList to be of type VBO<Vector3> list

我只是希望我的vboList只要满足以下约束<'T when 'T : (new : unit -> 'T) and 'T : struct and 'T :> ValueType>

就可以对每种类型进行相同的处理

这可能吗?

2 个答案:

答案 0 :(得分:1)

问题在于ab有不同的类型。

列表只能包含单一类型的元素。

例如,[a;a][b;b]一样好,但[a;b]不是。

解决这个问题的另一种方法是创建一个新类heirachy,如果你有一个新的floatVector3,它们都从同一个基类继承而你可以将对象转发到那个类型。< / p>

答案 1 :(得分:1)

您可以做的一件事是创建一个基本无参数类型并将其用作列表的元素:

type VBO_Base =
    class end

type VBO<'T when 'T : (new : unit -> 'T) and 'T : struct and 'T :> ValueType> = 
    inherit VBO_Base
    ...

type VAO =
    static member Create(vboList : VBO_Base list) = 
    ...

val a : VBO<Vector3>
val b : VBO<float>

VAO.Create([a;b]) // both a and be get automatically downcast to VBO_Base

事实上,您可以调用此基类型VBO,因为如果.NET具有不同数量的参数,则允许两种不同类型具有相同的名称。