在C#中是否可以创建一个未指定泛型类型的数组?有点像这样:
ShaderParam<>[] params = new ShaderParam<>[5];
params[0] = new ShaderParam<float>();
或者由于C#的强力打字,这根本不可能吗?
答案 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)
比赛的时间已晚,但问题如下:http://www.codeproject.com/Articles/1097830/Down-the-Rabbit-Hole-with-Array-of-Generics
答案 7 :(得分:0)
不直接。封闭的泛型是幕后的特定“类型”,因此即使是开放的泛型也太笼统而不是“强类型”。
我能想到的最好的解决方案,就是我之前使用的,是为泛型类创建一个非泛型的祖先。该解决方案是否起作用取决于您打算使用该阵列的目的。