我有以下两个文件:
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
时,它会解析为Im
,IM
在名为 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
答案 0 :(得分:0)
这与global
和Vert.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?