当两个类名碰撞时,C#如何选择

时间:2015-12-15 04:40:19

标签: c#

我有以下两个文件:

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告诉我,当我在IM中使用IGlobalApiProvider时,它会解析为ImIM在名为 RtmStart.cs的文件中定义 无命名空间声明。当我在 SlackApi.cs 中使用Vert.Slack.Im时,它会解析为map<string, double>::iterator tempMap; tempMap = keys.begin(); ,这是在名为 Im的文件中的Vert.Slack命名空间中定义的。 CS 即可。奇怪的行为提醒我冗余的定义,所以我删除它,事情正常。

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

有人能说清楚这个吗?

您看到的所有内容都包含在 Vert.dll 中,其中包含一个项目 Vert.csproj

Link to the four files mentioned in this post as they existed at the time of writing

2 个答案:

答案 0 :(得分:0)

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

编译器使用定义的正确类查找最明确的命名空间。

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

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

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

答案 1 :(得分:-1)

这可能与您的命名空间位置错误有关; - )

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

这里的答案给出了一个很好的解释:Should 'using' statements be inside or outside the namespace?