当两个类名发生冲突时,C# 如何选择

本文关键字:何选择 冲突 选择 两个 | 更新日期: 2023-09-27 18:26:52

我有以下两个文件:

IGlobalApiProvider.cs

using System.Collections.Generic;
using Vert.Slack;
namespace Vert.Interfaces
{
    public interface IGlobalApiProvider
    {
        List<Im> ImList();
    }
}

以及相应的实现:SlackApi.cs

using System.Collections.Generic;
using Vert.Interfaces;
namespace Vert.Slack
{
    public class SlackApi : IGlobalApiProvider
    {
        public List<Im> ImList()
        {
            ...
        }
    }
}

现在,Intellisense告诉我,当我在IGlobalApiProvider中使用IM时,它会解析为Im,这是在名为RtmStart的文件中定义的.cs该文件没有命名空间声明。当我在 SlackApi.cs 中使用 IM 时,它会解析为Vert.Slack.Im在名为 Im.cs 的文件中的 Vert.Slack 命名空间中定义的内容。奇怪的行为提醒我注意多余的定义,所以我删除了它,一切正常。

但是,我很困惑为什么Visual Studio在这两种方式上表现不同。我可以说在两种情况下以不同的模式扫描类名。我还可以说,在同一命名空间中使用与在使用命名空间的类中使用似乎是触发因素。我不知道的是,是什么机制控制了这种行为背后的逻辑。

谁能阐明这一点?

您看到的所有内容都包含在 Vert.dll 中,它由一个项目 Vert.csproj 组成。

链接到本文中提到的四个文件,因为它们在撰写本文时存在。

当两个类名发生冲突时,C# 如何选择

这与 globalVert.Slack 命名空间之间的差异有关。

编译器查找定义了正确类的最显式命名空间。

在此示例中,当编译器在 IGlobalInterfaceProvider.cs 中查找Im的定义时,此文件中没有定义(或使用(包含类的命名空间,但Im也在此文件中定义 - 该文件在全局命名空间中声明。

当编译器在 SlackApi.cs 中查找Im的定义时,Im会在显式 Vert.Slack 命名空间中找到,并利用该类。

这里的答案是一个类似的主题,可能会提供更多的见解。

这可能与您的命名空间位于错误位置的事实有关;-(

http://www.stylecop.com/docs/SA1200.html

这个答案在这里给出了一个很好的解释:"using"语句应该在命名空间内部还是外部?