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

ゲームにはかなり遅れていますが、その方法は次のとおりです

于 2016-05-04T16:14:28.330 に答える
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を使用できます

お役に立てれば。

于 2011-03-07T17:31:28.277 に答える
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 に答える
0

直接ではありません。クローズ ジェネリックは、舞台裏で特定の「型」であるため、オープン ジェネリックでさえ、一般的すぎて「強力な型」にはなりません。

私が考えることができる最善の解決策は、ジェネリック クラスに非ジェネリックの祖先を作成することです。そのソリューションが機能するかどうかは、アレイの使用目的によって異なります。

于 2011-03-07T17:23:55.753 に答える