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>
这可能吗?
答案 0 :(得分:1)
问题在于a
和b
有不同的类型。
列表只能包含单一类型的元素。
例如,[a;a]
与[b;b]
一样好,但[a;b]
不是。
解决这个问题的另一种方法是创建一个新类heirachy,如果你有一个新的float
和Vector3
,它们都从同一个基类继承而你可以将对象转发到那个类型。< / 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具有不同数量的参数,则允许两种不同类型具有相同的名称。