Visual Studio在不需要时建议完全限定的命名空间

时间:2012-04-22 20:48:55

标签: c# visual-studio intellisense

使用Visual Studio 2010(可能还有2008),我注意到Intellisense将为枚举建议完全限定名称空间的行为。

例如,我可以编写如下代码:

element.HorizontalAlignment = HorizontalAlignment.Right;
element.VerticalAlignment = VerticalAlignment.Bottom;

但是当我尝试写它时,它建议我这样写:

element.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
element.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;

这个不必要的额外代码可以真正加起来并使其可读性降低,我必须基本上与Intellisense对抗以避免它。

我有理由这样做吗?我可以把它关掉吗?我假设原因是枚举的名称与属性的名称相同。但这确实不是一个好理由。

修改

这是另一个演示为什么不需要完全限定命名的例子。

using SomeOtherNamespace;

namespace SomeNamespace
{
    public class Class1
    {
        public Class2 Class2 { get; set; }

        public Class1()
        {
            // These all compile fine and none require fully qualified naming.  The usage is context specific.
            // Intellisense lists static and instance members and you choose what you wanted from the list.

            Class2 = Class2.Default;
            Class2.Name = "Name";
            Class2.Name = Class2.Default.Name;
            Class2 = Class2;
        }
    }
}

namespace SomeOtherNamespace
{
    public class Class2
    {
        public static Class2 Default { get; set; }

        // public static Class2 Class2;  (This throws an error as it would create ambiguity and require fully qualified names.)

        // public static string Name { get; set; }  (This also throws an error because it would create ambiguity and require fully qualified names.

        public string Name { get; set; }
    }
}

5 个答案:

答案 0 :(得分:6)

假设您正在WPF环境中工作(我看到了元素),并且以某种方式引用了System.Windows.Forms dll。

我的推论基于以下事实:HorizontalAlignment可以在两个名称空间中找到:

System.Windows.Forms.HorizontalAlignment

中的

System.Windows.FrameworkElement.HorizontalAlignment

中的

有两个引用指向同一类型,VS要求指定完全的名称空间

答案 1 :(得分:5)

这确实似乎是same name for property & the type 这是模仿事物的smallest reproducible example(可能更小但显示更多)......

namespace Company.Project.SubProject.Area.Test.AndSomeMore
{
    public class TestClass
    {
        public TestEnum MyEnum { get; set; }
        public TestEnum TestEnum { get; set; }
        public SndTestEnum NewEnum { get; set; }
    }
    public enum TestEnum
    {
        None,
        One,
        Two
    }
    public enum SndTestEnum
    {
        None,
        One,
        Two
    }
}
namespace MyCallerNS
{
    public class MyTestClass : TestClass
    {
        public MyTestClass()
        {
            this.TestEnum = Company.Project.SubProject.Area.Test.AndSomeMore.TestEnum.One;
            this.MyEnum = Company.Project.SubProject.Area.Test.AndSomeMore.TestEnum.Two;
            this.NewEnum = SndTestEnum.None;
        }
    }
}

MyEnumTestEnum属性(定位TestEnum枚举)都提供“完全限定”名称(其他名称与其属性类型不同,但类型与其他属性的名称匹配,因此被'污染') - 虽然SndTestEnum有不同的命名(对于类型,属性)并且在任何一种情况下都能正常工作。

...有趣的是,即使您删除了namespace MyCallerNS并将所有内容置于“长命名空间”之下 - 它仍然会在前面添加AndSomeMore.

我认为没有解决方案(没有Re#和第三方工具),
正如@Rick建议的那样,这似乎是不是as smart as the compiler案例的智能感知。

或者更确切地说 - 编译器花时间来解决问题(手头有所有信息),而intellisense没有那个“深度”和对事物的洞察力(我猜测,真正简化 - 我们需要@Eric这个:)并做出快速/最简单的选择。

编辑:实际上,根据我之前的想法,
它更多地是关于每个执行的“工作” - 而智能感知(作为完成'服务')必须向您提供列表中的所有选择(属性名称和类型)(我不认为它们都是现在,但一个猜测。有一个选择来覆盖两者可能是一个痛苦处理) 因此,要区分它会添加完全限定的名称 它“失败”(有点)的地方是“粘贴”最终的“短版本” - 我确实应该这么想。

答案 2 :(得分:2)

我发现如果我键入element.HorizontalAlignment =,那么VS2010会自动建议System.Windows.HorizontalAlignment,如果按Tab键,将会选择该HorizontalAlignment.Center HorizontalAlignment.Left HorizontalAlignment.Stretch HorizontalAlignment.Right 。如果不是按Tab键而是键入'Ho'来缩小列表范围,然后按Tab键,您将获得Horizo​​ntalAlignment。

如果您能够使用Resharper,那么在输入'='后,您将看到最明显的选择:

{{1}}

答案 3 :(得分:1)

这是编译器比Intellisense更聪明的情况。

如果您要访问的属性与其类型相同,例如“public TextAlignment TextAlignment {get; set;}”,您不需要完全限定分配给它的枚举值的命名空间。但是,Intellisense似乎并不聪明,不知道这一点。代码在没有资格的情况下工作正常,你只需要善于注意并躲避Intellisense。

答案 4 :(得分:0)

除了上面的答案,我还有一些涉及Microsoft Office Automation的项目。我的课程结构为

  • CustomNameSpace.Library.Microsoft.Word.CustomClass1
  • CustomNameSpace.Library.Microsoft.Excel.AnotherCustomClass

当尝试访问.NET框架本身的Microsoft命名空间内的任何内容时,Intellisense会强制您完全限定名称。在根冲突的情况下,它也会预先挂起全局关键字,如:global::Windows.Forms.etc...