首页 > 解决方案 > C# 如何知道如何正确修改命名空间以使其工作?

问题描述

C# 如何知道如何正确修改命名空间以使其工作?

最近我遇到了一个看似简单的概念,但我对正在发生的事情缺乏清晰的理解感到震惊。一个简单的谷歌搜索并没有帮助我获得更好的照片。所以,我提出这个问题。

我有一个包含两个文件的项目:

文件1.cs

namespace A.B.C
{
    using E.F;

    public class D 
    {
        G g;
    }
}

文件2.cs

namespace A.B.E.F
{
    public class G { }
}

现在,在我的同事指出这一点之前,我从未遇到过这种情况,尽管我阅读了一些关于 C# 的深入书籍并且在使用 C# 方面有相当长的经验。所以,这里 C# 解析器做了一件非常聪明的事情。他using E.F;File1.cs中获取,获取封闭的命名空间(即namespace A.B.C),从封闭的命名空间中移除C并将 添加E.F到剩余的命名空间部分。最后得到using A.B.E.F

修改对我来说似乎一点也不简单。编译器现在应该从 中删除多少尾随命名空间A.B.C(在本例中为 1 - 即C),以便添加E.F会导致包含class G.

现在我问我对正在发生的事情的理解是否正确,我在哪里可以阅读编译器所做的这些修改?

更新

如果我们获取以下文件:

文件1.cs

namespace A.B.C
{
    using E.F;

    public class D 
    {
        G g;
    }
}

文件2.cs

namespace A.B.E.F
{
    public class G { }
}

namespace E.F
{

}

编译器仍然能够准确定位File1.csA.B.E.F中的行,而不是. 因此,编译器不只是寻找注释中指出的命名空间,而是寻找包含. 如果我错了,请纠正我。using E.F;E.FE.FE.Fclass G

更新 2

指向这个(来自@Damien_The_Unbeliever)文档的评论让我想到了File1.csFile2.cs的第一个版本。从某种意义上说,它们产生的结果是这样的:

namespace A
{
    namespace B
    {
        namespace C
        {
            using E.F;

            public class D
            {
                G g;
            }
        }

        namespace E
        {
            namespace F
            {
                public class G { }
            }
        }
    }
}

现在我们可以using E.F通过命名空间链向上移动。命名空间E.F是从命名空间开始定义的A.B,因此以下是合法的:

namespace A
{
    namespace B
    {
        using E.F;

        namespace C
        {
            public class D
            {
                G g;
            }
        }

        namespace E
        {
            namespace F
            {
                public class G { }
            }
        }
    }
}

虽然以下是不合法的,因为在命名空间中A我们仍然不知道E.F命名空间:

namespace A
{
    using E.F;

    namespace B
    {
        namespace C
        {
            public class D
            {
                G g;
            }
        }

        namespace E
        {
            namespace F
            {
                public class G { }
            }
        }
    }
}

但是,我们知道B.E.Fnamespace 中的命名空间A,所以以下是合法的:

namespace A
{
    using B.E.F;

    namespace B
    {
        namespace C
        {
            public class D
            {
                G g;
            }
        }

        namespace E
        {
            namespace F
            {
                public class G { }
            }
        }
    }
}

所以,我的猜测是我关于 C# 计算命名空间的第一个假设是错误的。实际上 C# 不计算命名空间,而只知道每个给定命名空间中的一组命名空间。在某些情况下,某些命名空间可能有多个名称。例如,命名空间在A.B.E.F命名空间内具有以下名称A.BA.B.E.F, B.E.F, E.F. 所有 3 个命名空间名称都指向同一个命名空间。我的理解正确吗?

标签: c#namespaces

解决方案


推荐阅读