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例のように)。また、型パラメーターが反変の位置 (メソッド パラメーターなど) にある場合も使用できません。それでも、このテクニックについて知っておくとよいかもしれません。
ゲームにはかなり遅れていますが、その方法は次のとおりです。
指定されていないジェネリック型の配列を作成します。
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を使用できます
お役に立てれば。
それは意味がありません。
あなたが書くとどうなりますparams[3]か?
何型でしょう?
非ジェネリックな基本クラスまたはインターフェイスを作成し、それらの配列を使用することができます。
これは、T が定義されているジェネリック クラスまたはジェネリック拡張メソッドで可能です。
ShaderParam<T>[] params = new ShaderParam<T>[5];
ShaderParam<>いいえ、インスタンス化された型に関する限り、概念は無意味です。つまり、具象ShaderParam<float>はのインスタンスではありませんShaderParam<>。したがって、宣言された配列の型は、そのインスタンスを保持するためには無効です。(そもそも、すでに違法な構文であるという事実に加えて。)
直接ではありません。クローズ ジェネリックは、舞台裏で特定の「型」であるため、オープン ジェネリックでさえ、一般的すぎて「強力な型」にはなりません。
私が考えることができる最善の解決策は、ジェネリック クラスに非ジェネリックの祖先を作成することです。そのソリューションが機能するかどうかは、アレイの使用目的によって異なります。