3

これは、私が以前に尋ねたのと同じ質問です: メソッドが 2 種類のデータを引数として受け入れるようにする方法は?

しかし、現在の状況は大きく異なります。

これを取る:

public FormResourceSelector(Dictionary<string, Effect> resourceList, string type)

大丈夫、何も問題ありません。今、私はこれを実行しようとしています:

FormResourceSelector frs = new FormResourceSelector(AreaEffect.EFFECTS, "Area effect");
FormResourceSelector frs2 = new FormResourceSelector(DistanceEffect.EFFECTS, "Distance effect");

AreaEffect と DistanceEffect (カスタム クラス) はどちらも Effect から派生します。

public class AreaEffect : Effect
{
    public static Dictionary<string, AreaEffect> EFFECTS = new Dictionary<string, AreaEffect>();
    ...
}

新しい FormResourceSelector インスタンスの作成中に、何らかの理由で次のエラーが発生します。

Argument 1: cannot convert from 'System.Collections.Generic.Dictionary<string,SCreator.AreaEffect>' to 'System.Collections.Generic.Dictionary<string,SCreator.Effect>'  

で:

new FormResourceSelector(AreaEffect.EFFECTS, "Area effect");

辞書が嫌がらせではないかと疑っていますが、これを修正する方法がよくわかりません。

編集: 最初に指定したコード スニペットで、Dictionary と Dictionary の両方を resourceList として入力できるようにするのが最も簡単です。

4

4 に答える 4

8

クラスをジェネリックにしないのはなぜですか?

public class FormResourceSelector<T>
    where T : Effect
{
    public FormResourceSelector(Dictionary<string, T> resourceList, string type)
    {
    }
}
于 2012-05-21T14:46:11.647 に答える
2

コメントするには大きすぎるため、コンパイルするために更新されたlliaの回答を次に示します。

public class FormResourceSelector<T> where T : Effect
{
    // Constructor
    public FormResourceSelector(
       Dictionary<string, T> resourceList, string type) 
    {

    }
}
于 2012-05-21T15:05:14.873 に答える
0

次の点を考慮してください。

public FormResourceSelector(Dictionary<string, Effect> resourceList, string type)
{
    resourceList.Add(new Effect());
}

派生型の辞書を次の場所に渡しますか?

var effects = new Dictionary<string, AreaEffect>();
new FormResourceSelector(effects, "");

Effect実際にに設定しようとすると問題が発生する可能性がありますAreaEffect。コンパイラはこれを阻止しています。

他の回答が示すように、コンパイル時に型を指定するためにジェネリックを使用できます。

于 2012-05-21T14:48:04.597 に答える
0

ここでの概念は分散として知られています-そして、辞書は読み取り専用ではないため、共分散をサポートしていないという問題に遭遇しました-これは安全ではありません。次に例を示します。

IDictionary<string, object> myDict = new Dictionary<string, string>();
myDict["hello"] = 5; // not an string

参照: .NET 4 の IDictionary<TKey, TValue> は共変ではありません

于 2012-05-21T14:48:30.450 に答える