当您拥有类似以下的财产时:
using Algebra;
public Algebra.Vector3 Direction
{
get { return this.direction; }
}
然后编译,稍后修改为:
using Algebra;
public Vector3 Direction
{
get { return this.direction; }
}
两个程序集之间编译的代码似乎不同,我可以使用 Reflector 看到这一点。
为什么编译器要区分这两个代码?是不是只需要在编译时查看是否有歧义类型,如果没有,编译后的代码是否相同?我假设编译后的代码始终对每个成员使用完全限定名称。
我无法重现这个。示例代码:
namespace Algebra
{
public class Vector3 {}
}
namespace Test
{
using Algebra;
public class Program
{
private Vector3 direction = null;
public Vector3 Direction1
{
get { return direction; }
}
public Algebra.Vector3 Direction2
{
get { return direction; }
}
}
}
这两个属性生成的 IL 完全相同,并且它们在反射器中看起来相同。
我的猜测是,您实际上在“全局”命名空间(或您有 using 指令的其他命名空间)中获得了另一个名为
Vector3
的类。
尝试将鼠标悬停在 Visual Studio 中的两个类型名称上并查看它们显示的内容。
这是一个示例,它将生成您正在观察的结果。希望这能澄清您的问题。假设你有
Vector3
中包含类型
Algebra
;
namespace NotAlgebra
{
public class Vector3
{
// ...
}
}
文件②
using Algebra;
namespace NotAlgebra
{
public class XYZ
{
// Refers to NotAlgebra.Vector3 (defined in File 1 above)
Vector3 MyProperty1 { get; }
// Refers to Algebra.Vector3 (defined in the external library)
Algebra.Vector3 MyProperty2 { get; }
}
}