当我们在两个不同的程序集中定义相同的命名空间和类名时,.NET编译器(以及运行时的CLR)如何确定要使用哪个类,而不使用extern别名来帮助它决定?考虑这个示例 - 所有这些都在一个.cs文件中:
using System;
namespace Nonsense
{
class Program
{
static void Main(string[] args)
{
String s = new System.String();
}
}
}
namespace System
{
public class String
{
// Nothing here
}
}
此代码编译时没有任何错误。在运行时,此代码使用上面显示的空System.String而不是框架中的那个。为什么?这是确定性的,如果是,那么规则是什么? 将上面的System.String的空实现移动到另一个程序集并引用它做同样的事情 - Main看到空的。为什么?它如何选择在自定义程序集中使用空的那个而不是框架的系统程序集中的“真正的”呢?
答案 0 :(得分:1)
你检查过警告了吗? 我有以下警告:
警告CS1685:预定义类型
System.String' is defined multiple times. Using definition from
mscorlib.dll'(CS1685)警告CS0436:类型`System.String'与导入的同名类型冲突'。忽略导入的类型定义(CS0436)
关于第一个的详细信息是答案:http://msdn.microsoft.com/en-us/library/8xys0hxk.aspx
答案 1 :(得分:1)
它与您的using
指令有关。它们的放置位置会影响引用的解析方式。如果using
指令放在namespace
声明之外,则该命名空间的内容将加载到全局命名空间中。但是,如果using
指令放在namespace
声明中,则其内容将加载到该命名空间中。
搜索全局命名空间 last 。
您可以使用全局命名空间别名来控制这一点,如http://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx
中所述另见