我需要序列化KeyValuePair,我在这里找到了解决方案:
Is there a serializable generic Key/Value pair class in .NET?
所以我使用了那个问题的接受答案,说你只需要像这样定义类/结构
public class KeyValuePair<K,V>
{
public K Key {get;set;}
public V Value {get;set;}
}
这有效但现在有2个具有相同名称的泛型类。上面的自定义类和System.Collections.Generics
命名空间中的自定义类。
那么当存在像这样的代码时,编译器如何知道要使用哪一个
myList=new List<KeyValuePair<string, string>>();
一个有签名KeyValuePair<K,V>
,另一个是KeyValuePair<TKey,TValue>
,因此两个都有相同数量的类型参数。
为什么代码编译没有错误?
答案 0 :(得分:3)
当C#编译器看到需要解析的名称时,它遵循规范中的步骤 - 规则在3.8节(“namespace-or-type-name”)和7.6.2(“简单名称”)中)。
这完全取决于背景:
我个人建议反对重用一个名称,该名称也在常用名称空间的框架中......这将使得在同一代码段中引用这两种类型变得更加困难。但它实际上并没有导致编译器出现任何问题。
答案 1 :(得分:1)
名称,命名空间泛型类型参数对于每个程序集都是唯一的。没有什么可以阻止你像你那样创建另一个类型,但是如果另一个项目使用两个程序集(系统一个和你的程序集),编译器将无法确定使用哪个类型。
当使用具有不同版本的两个相同程序集时,会出现同一问题的另一个变体,编译器将选择并绑定到可能导致痛苦的调试体验的程序(看起来好像这些类型匹配但是它们不匹配 - 框架本身没有问题但是)。
请注意,您无法通过“重新定义”来替换另一个程序集中的类型。
答案 2 :(得分:0)
查看文件中的“using”指令。正如你所说的,这些类存在于不同的命名空间中,因此你的类可能会明确地使用其中一个,这会使编译器陷入两难境地。