为什么 C# 编译器要区分这两种情况?

问题描述 投票:0回答:2

当您拥有类似以下的财产时:

using Algebra;

public Algebra.Vector3 Direction
{
    get { return this.direction; }
}

然后编译,稍后修改为:

using Algebra;

public Vector3 Direction
{
    get { return this.direction; }
}

两个程序集之间编译的代码似乎不同,我可以使用 Reflector 看到这一点。

为什么编译器要区分这两个代码?是不是只需要在编译时查看是否有歧义类型,如果没有,编译后的代码是否相同?我假设编译后的代码始终对每个成员使用完全限定名称。

c# .net
2个回答
7
投票

我无法重现这个。示例代码:

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 中的两个类型名称上并查看它们显示的内容。


2
投票

这是一个示例,它将生成您正在观察的结果。希望这能澄清您的问题。假设你有

    一个单独的库,在命名空间
  • 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; } } }

	
© www.soinside.com 2019 - 2024. All rights reserved.