未指定类型的泛型类的数组
答
这是不可能的。在通用类型受您控制的情况下,您可以创建一个非泛型基类型,例如
ShaderParam[] params = new ShaderParam[5]; // Note no generics
params[0] = new ShaderParam<float>(); // If ShaderParam<T> extends ShaderParam
我的猜测是,这是你无法控制的,虽然一个XNA类型。
答
这没有意义。
如果你写params[3]
会发生什么?
是什么类型?
您可能想创建一个非泛型基类或接口并使用它们的数组。
答
这是可能在通用类或通用扩展方法其中T的定义:
ShaderParam<T>[] params = new ShaderParam<T>[5];
答
否,就一个实例化的类型而言的概念ShaderParam<>
是无意义的。换句话说,一个具体的ShaderParam<float>
是而不是ShaderParam<>
的一个实例。因此,该数组的声明类型对于保存该实例将是非法的。 (超出事实,它已经是非法的语法开头。)
答
不是直接。封闭泛型是幕后特定的“类型”,所以即使是开放式泛型也太笼统,不能成为“强类型”。
我能想到的,我以前用过的最好的解决方案是为泛型类创建一个非泛型的祖先。该解决方案的功能是否取决于您计划使用阵列的方式。
答
创建未指定泛型类型的数组:
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]);
如果您需要执行的对象,你可以使用反射
希望这有助于某种类型的具体行动。
答
您可以使用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
在我的示例中)。如果类型参数出现在逆变位置,例如也不能使用。作为方法参数。不过,了解这种技术可能是一件好事。
这不是,这是我自己的类)。现在尝试。 – Hannesh 2011-03-07 17:28:04