10

是否可以在 C# 中创建未指定泛型类型的数组?类似这样的东西:

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

还是由于 C# 的强类型,这根本不可能?

4

8 回答 8

18

这是不可能的。如果泛型类型在您的控制之下,您可以创建一个非泛型基类型,例如

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

我的猜测是,这是您无法控制的 XNA 类型。

于 2011-03-07T17:23:18.107 回答
11

可以将协变接口用于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

于 2011-03-07T18:59:36.380 回答
3

游戏比较晚,但方法如下:http: //www.codeproject.com/Articles/1097830/Down-the-Rabbit-Hole-with-Array-of-Generics

于 2016-05-04T16:14:28.330 回答
1

那是没有意义的。

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

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

于 2011-03-07T17:21:50.600 回答
1

这在定义了 T 的泛型类泛型扩展方法中是可能的:

ShaderParam<T>[] params = new ShaderParam<T>[5];
于 2011-03-07T17:22:49.450 回答
1

ShaderParam<>不,就实例化类型而言,这个概念毫无意义。换句话说,具体ShaderParam<float>不是实例ShaderParam<>。因此,数组的声明类型对于持有该实例是非法的。(除了它已经是非法的语法这一事实之外。)

于 2011-03-07T17:22:49.827 回答
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]);

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

希望这可以帮助。

于 2011-03-07T17:31:28.277 回答
0

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

我能想到的最好的解决方案(我以前使用过)是为泛型类创建一个非泛型祖先。该解决方案是否有效取决于您计划使用该阵列的目的。

于 2011-03-07T17:23:55.753 回答