【问题标题】:How to let a method accept two types of data as argument?如何让一个方法接受两种类型的数据作为参数?
【发布时间】:2012-05-28 01:59:02
【问题描述】:

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

我怀疑字典是一种骚扰,但我真的不知道如何解决这个问题。

编辑:最简单的方法是在我给出的第一个代码 sn-p 中允许将 Dictionary 和 Dictionary 作为 resourceList 输入。

【问题讨论】:

  • 您是否尝试将输入转换为 (Effect)AreaEffect.EFFECTS ?
  • 我还需要存储在 AreaEffect 中的“特殊”数据,而不仅仅是普通的 Effect 数据。恐怕很难解释。

标签: c# .net arguments


【解决方案1】:

考虑以下几点:

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

您是否要传递派生类型的字典:

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

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

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

【讨论】:

    【解决方案2】:

    为什么不让你的类通用?

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

    【讨论】:

    • 恐怕我不知道什么是“通用方法”。我一开始就尝试复制粘贴您的代码,但在 msvc 中一切都变成“错误”:i.imgur.com/5KW8E.png
    • @SwDevMan81 啊,是的,我从问题中复制粘贴了
    • 呵呵,已编辑;)。几次更改后没有错误。好像行得通!非常感谢,我现在将研究这些泛型类是如何工作的。
    • @Tgys 是的,对不起,我没有意识到这是一个类构造函数。
    【解决方案3】:

    评论太大,所以这里是llia的答案更新编译:

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

    【讨论】:

    • 感谢类声明行。对此感到困惑。 :)
    • 是的...我需要多加注意:)
    • 没问题,我们把它摆平了:)
    【解决方案4】:

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

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

    见:IDictionary<TKey, TValue> in .NET 4 not covariant

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2016-01-25
      相关资源
      最近更新 更多