我正在尝试使用以下代码实现泛型类:
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<T>();
会产生错误。错误CS0029无法将类型'ConfigurationDictionary [GenericsTest,版本= 1.0.0.0,文化=中性,PublicKeyToken =空]隐式转换为'ConfigurationDictionary [GenericsTest,版本= 1.0.0.0,文化=中性,PublicKeyToken =空]
该消息对我来说没有意义,因为它基本上说它无法将“ typeA”转换为“ typeA”。有人可以解释这段代码有什么问题吗?
最佳答案
您已经用函数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)
{
}
}
}