【问题标题】:Dictionary in generic class泛型类中的字典
【发布时间】:2016-06-11 10:54:05
【问题描述】:

我正在尝试使用以下代码实现泛型类:

interface IBasicInput<T> where T : InputOutputConfig
{
    void Configure<T>(ConfigurationDictionary<T> conf) where T : InputOutputConfig;
}

public class ConfigurationDictionary<T> : Dictionary<string,T> where T : InputOutputConfig
{    
}

public abstract class InputOutputConfig
{   
}

public class SpecificInputConfig : InputOutputConfig
{
}    

public class GenericInput<T> : IBasicInput<T> where T : InputOutputConfig
{
    ConfigurationDictionary<T> configuration;

    public GenericInput()
    {
        configuration = null;
    }

    public void Configure<T>(ConfigurationDictionary<T> _conf) where T : InputOutputConfig
    {
        configuration = new ConfigurationDictionary<T>();
        foreach (KeyValuePair<string,T> kvp in _conf)
        {

        }
    }
}

问题是configuration = new ConfigurationDictionary&lt;T&gt;(); 产生错误。

错误 CS0029 无法将类型“ConfigurationDictionary [GenericsTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]”隐式转换为“ConfigurationDictionary [GenericsTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]”

这条消息对我来说没有意义,因为它基本上说它不能将“typeA”转换为“typeA”。有人能解释一下这段代码有什么问题吗?

【问题讨论】:

  • 您的问题是因为您在 Configure 方法的范围内有两个名为 T 的泛型类型参数

标签: c#


【解决方案1】:

你已经用你的函数T模板参数隐藏了你的类的T模板参数。而且它们可能不一样。

要么给你内心的T 取另一个名字,比如T2,或者如果你打算使用你的类'T,可以把它全部删除:

public class GenericInput<T> : IBasicInput<T> where T : InputOutputConfig
{
    ConfigurationDictionary<T> configuration;

    public GenericInput()
    {
        configuration = null;
    }

    public void Configure<T2>(ConfigurationDictionary<T2> _conf) where T2 : InputOutputConfig
    {
        // in this line, you need the class template T, not the inner T2
        configuration = new ConfigurationDictionary<T>();

        foreach (KeyValuePair<string,T2> kvp in _conf)
        {

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2010-10-15
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多