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

时间:2011-03-07 17:19:41

标签: c# generics typing

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

ShaderParam<>[] params = new ShaderParam<>[5];
params[0] = new ShaderParam<float>();

或者由于C#的强力打字,这根本不可能吗?

8 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分: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等值类型。协方差仅对引用类型有效(例如 my 示例中的string)。如果类型参数出现在逆变位置,您也无法使用,例如作为方法参数。不过,了解这项技术可能还是不错的。

答案 2 :(得分:2)

这没有意义。

如果你写params[3]会怎么样? 它是什么类型的?

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

答案 3 :(得分:1)

这可以在泛型类泛型扩展方法中定义T:

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

答案 4 :(得分:1)

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

答案 5 :(得分: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]);

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

希望这有帮助。

答案 6 :(得分:1)

答案 7 :(得分:0)

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

我能想到的最好的解决方案,就是我之前使用的,是为泛型类创建一个非泛型的祖先。该解决方案是否起作用取决于您打算使用该阵列的目的。