具有未指定类型的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
但是你不能在你的例子中使用像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的内容。