是否可以在 C# 中创建未指定泛型类型的数组?类似这样的东西:
ShaderParam<>[] params = new ShaderParam<>[5];
params[0] = new ShaderParam<float>();
还是由于 C# 的强类型,这根本不可能?
这是不可能的。如果泛型类型在您的控制之下,您可以创建一个非泛型基类型,例如
ShaderParam[] params = new ShaderParam[5]; // Note no generics
params[0] = new ShaderParam<float>(); // If ShaderParam<T> extends ShaderParam
我的猜测是,这是您无法控制的 XNA 类型。
您可以将协变接口用于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
游戏比较晚,但方法如下:http: //www.codeproject.com/Articles/1097830/Down-the-Rabbit-Hole-with-Array-of-Generics
那是没有意义的。
如果你写会发生什么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]);
如果您需要对对象执行某些类型特定的操作,您可以使用反射
希望这可以帮助。
不是直接的。封闭的泛型是幕后的特定“类型”,因此即使是开放的泛型也太笼统而不能成为“强类型”。
我能想到的最好的解决方案(我以前使用过)是为泛型类创建一个非泛型祖先。该解决方案是否有效取决于您计划使用该阵列的目的。