如何让一个方法接受两种类型的数据作为参数?

时间:2012-05-21 14:43:28

标签: c# .net arguments

这与我前段时间提出的问题有些相同: 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。

4 个答案:

答案 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

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