2011-03-07 73 views

回答

15

这是不可能的。在通用类型受您控制的情况下,您可以创建一个非泛型基类型,例如

ShaderParam[] params = new ShaderParam[5]; // Note no generics 
params[0] = new ShaderParam<float>(); // If ShaderParam<T> extends ShaderParam 

我的猜测是,这是你无法控制的,虽然一个XNA类型。

+0

这不是,这是我自己的类)。现在尝试。 – Hannesh 2011-03-07 17:28:04

2

这没有意义。

如果你写params[3]会发生什么?
是什么类型?

您可能想创建一个非泛型基类或接口并使用它们的数组。

1

这是可能在通用类通用扩展方法其中T的定义:

ShaderParam<T>[] params = new ShaderParam<T>[5]; 
1

否,就一个实例化的类型而言的概念ShaderParam<>是无意义的。换句话说,一个具体的ShaderParam<float>而不是ShaderParam<>的一个实例。因此,该数组的声明类型对于保存该实例将是非法的。 (超出事实,它已经是非法的语法开头。)

0

不是直接。封闭泛型是幕后特定的“类型”,所以即使是开放式泛型也太笼统,不能成为“强类型”。

我能想到的,我以前用过的最好的解决方案是为泛型类创建一个非泛型的祖先。该解决方案的功能是否取决于您计划使用阵列的方式。

1

创建未指定泛型类型的数组:

Object[] ArrayOfObjects = new Object[5]; 
ArrayOfObjects[0] = 1.1; 
ArrayOfObjects[1] = "Hello,I am an Object"; 
ArrayOfObjects[2] = new DateTime(1000000); 

System.Console.WriteLine(ArrayOfObjects[0]); 
System.Console.WriteLine(ArrayOfObjects[1]); 
System.Console.WriteLine(ArrayOfObjects[2]); 

如果您需要执行的对象,你可以使用反射

希望这有助于某种类型的具体行动。

7

可以使用ShaderParam<T>协变接口:

interface IShaderParam<out T> { ... } 
class ShaderParam<T> : IShaderParam<T> { ... } 

用法:

IShaderParam<object>[] parameters = new IShaderParam<object>[5]; 
parameters[0] = new ShaderParam<string>(); // <- note the string! 

你不能与值类型使用它像float例子。协方差只适用于参考类型(例如string我的示例中)。如果类型参数出现在逆变位置,例如也不能使用。作为方法参数。不过,了解这种技术可能是一件好事。