2个通用类具有相同的名称和相同数量的类型参数但没有来自.NET中的编译器的抱怨?

时间:2012-04-22 08:13:45

标签: .net generics

我需要序列化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>,因此两个都有相同数量的类型参数。

为什么代码编译没有错误?

3 个答案:

答案 0 :(得分:3)

当C#编译器看到需要解析的名称时,它遵循规范中的步骤 - 规则在3.8节(“namespace-or-type-name”)和7.6.2(“简单名称”)中)。

这完全取决于背景:

  • 您引用名称的类型
  • 您在其中引用名称的名称空间
  • 代码中的using指令

我个人建议反对重用一个名称,该名称也在常用名称空间的框架中......这将使得在同一代码段中引用这两种类型变得更加困难。但它实际上并没有导致编译器出现任何问题。

答案 1 :(得分:1)

名称,命名空间泛型类型参数对于每个程序集都是唯一的。没有什么可以阻止你像你那样创建另一个类型,但是如果另一个项目使用两个程序集(系统一个和你的程序集),编译器将无法确定使用哪个类型。

当使用具有不同版本的两个相同程序集时,会出现同一问题的另一个变体,编译器将选择并绑定到可能导致痛苦的调试体验的程序(看起来好像这些类型匹配但是它们不匹配 - 框架本身没有问题但是)。

请注意,您无法通过“重新定义”来替换另一个程序集中的类型。

答案 2 :(得分:0)

查看文件中的“using”指令。正如你所说的,这些类存在于不同的命名空间中,因此你的类可能会明确地使用其中一个,这会使编译器陷入两难境地。