具有未指定类型的generics类的数组

在C#中是否可以创建一个未指定generics类型的数组? 有点像这样:

ShaderParam[] params = new ShaderParam[5]; params[0] = new ShaderParam(); 

或者这是不可能的,因为C#强大的打字?

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

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

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

可以ShaderParam使用协变接口:

 interface IShaderParam { ... } class ShaderParam : IShaderParam { ... } 

用法:

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

但是你不能在你的例子中使用像float这样的值类型。 协方差仅对引用类型有效(如我的示例中的string )。 如果类型参数出现在逆变位置,例如方法参数,则也无法使用它。 尽管如此,了解这种技术可能还是不错的。

这没有意义。

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

您可能希望创建非generics基类或接口并使用它们的数组。

这可以在generics类通用扩展方法中定义T:

 ShaderParam[] params = new ShaderParam[5]; 

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

创建一个未指定的generics类型数组:

 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]); 

如果需要对对象执行某些特定于类型的操作,可以使用Reflection

希望这可以帮助。

游戏的时间比较晚,但是这里是如何: http : //www.codeproject.com/Articles/1097830/Down-the-Rabbit-Hole-with-Array-of-Generics

不是直接的。 封闭的generics是幕后的特定“类型”,因此即使是开放的generics也太笼统而不是“强类型”。

我能想到的最好的解决方案,就是我之前使用的,是为generics类创建一个非generics的祖先。 该解决方案是否起作用取决于您计划使用该arrays的内容。