0

我需要序列化 ​​KeyValuePair,我在这里找到了解决方案:

.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>,所以两者都有相同数量的类型参数。

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

4

3 回答 3

3

当 C# 编译器看到它需要解析的名称时,它会遵循规范中的步骤 - 规则在第 3.8 节(“命名空间或类型名称”)和第 7.6.2 节(“简单名称”)中。

这一切都与上下文有关:

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

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

于 2012-04-22T08:22:31.020 回答
1

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

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

请注意,您不能通过“重新定义”来替换另一个程序集中的类型,就像这样。

于 2012-04-22T08:24:38.307 回答
0

查看文件中的“使用”指令。正如您所说,这些类驻留在不同的名称空间中,因此您的类可能显式使用其中之一,这使编译器摆脱了困境。

于 2012-04-22T08:17:50.240 回答