这与我前段时间提出的问题有些相同: How to let a method accept two types of data as argument?
然而目前的情况有很多不同。
拿这个:
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");
我怀疑dictonary是一种骚扰,但我真的不知道如何解决这个问题。
编辑:最简单的是允许在我给出的第一个代码片段中输入Dictionary和Dictionary作为resourceList。
答案 0 :(得分:8)
为什么不让你的班级通用?
public class FormResourceSelector<T>
where T : Effect
{
public FormResourceSelector(Dictionary<string, T> resourceList, string type)
{
}
}
答案 1 :(得分:2)
评论太大了,所以这里是llia的答案更新为编译:
public class FormResourceSelector<T> where T : Effect
{
// Constructor
public FormResourceSelector(
Dictionary<string, T> resourceList, string type)
{
}
}
答案 2 :(得分:0)
请考虑以下事项:
public FormResourceSelector(Dictionary<string, Effect> resourceList, string type)
{
resourceList.Add(new Effect());
}
您是否传递了派生类型的字典:
var effects = new Dictionary<string, AreaEffect>();
new FormResourceSelector(effects, "");
尝试将Effect
设置为真正 AreaEffect
时会遇到问题,编译器正在阻止这种情况发生。
您可以使用泛型来在编译时指定类型,正如其他答案所述。
答案 3 :(得分:0)
这里的概念被称为方差 - 你遇到了Dictionary不支持协方差的问题,因为它不是只读的 - 这是不安全的,例如:
IDictionary<string, object> myDict = new Dictionary<string, string>();
myDict["hello"] = 5; // not an string