3

这与我前段时间提出的问题有些相同: 如何让方法接受两种类型的数据作为参数?

然而,目前的情况不同......很多。

拿着这个:

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, "");

尝试将 an 设置Effect真正的 an时会遇到问题AreaEffect,编译器正在阻止这种情况发生。

正如其他答案所述,您可以使用泛型在编译时指定类型。

于 2012-05-21T14:48:04.597 回答
0

这里的概念被称为方差 - 你遇到了 Dictionary 不支持协方差的问题,因为它不是只读的 - 这将是不安全的,例如:

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

请参阅:IDictionary<TKey, TValue> in .NET 4 not covariant

于 2012-05-21T14:48:30.450 回答