没有任何言语:
public class MemoryDictionary<T>
{
private Dictionary<T, T> items = new Dictionary<T, T>();
public T GetValue<T>(T value)
{
if (!items.ContainsKey(value))
{
items[value] = value;
}
return items[value];
}
}
这里有什么问题,为什么不编译?我的意思是,它实际上说ContainsKey
方法有一个无效的参数,但是......它是愚蠢的!论证是正确的!
奇怪的是:
public class MemoryDictionary<string>
{
private Dictionary<string, string> items = new Dictionary<string,string>();
public string GetValue<string>(string value)
{
if (!items.ContainsKey(value))
{
items[value] = value;
}
return items[value];
}
}
这段代码和我选择某种特定类型的代码编译得很好......我震惊了......
答案 0 :(得分:7)
这里的问题是你已经定义了T
两次。您已经使类和方法都是通用的,并且给它们两个具有相同名称的通用参数。
您的字段是在方法之外定义的,因此该上下文中的T
仅引用声明为类的通用参数的T
。
参数value
在方法的泛型参数在范围内的位置声明,并且由于该方法的T
比在类级别声明的T
“更近”,在尝试解析该变量的类型时,它“胜出”。
所以现在你有一个T
类型的参数和一个Dicitonary<T, T>
,但该参数的类型仍然不同于字典的通用参数。
明确这一点的简单方法是使用通用参数并使用visual studio的“重命名”功能重命名类型(仅T2
或其他),然后您将看到{{1改变,哪些不改变。执行此操作后,错误消息也将有意义,因为这些不同的类型实际上将在错误消息中以不同方式显示。
至于修复,只是让方法不通用。
答案 1 :(得分:3)
您在类中的泛型类型约束与GetValue()
方法之间存在命名冲突。
删除方法的类型约束应解决问题:
public T GetValue(T value)