15

使用 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; }
    }
}
4

5 回答 5

6

I suppose you are working in WPF environment (I see element) and you have somehow the reference to System.Windows.Forms dll.

My deduction is based on fact that HorizontalAlignment can be found in both namespaces:

in System.Windows.Forms.HorizontalAlignment

and

in System.Windows.FrameworkElement.HorizontalAlignment

Having two references pointing to the same type, VS asks to specify what namespace exactly you mean.

于 2012-04-22T20:55:02.973 回答
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# 和 3rd 方工具),
这似乎不是智能感知as smart as the compiler,正如@Rick 所建议的那样。

或者更确切地说 - 编译器需要时间来解决问题(手头有所有信息),而智能感知没有那种“深度”和洞察力(我猜,真的很简化 - 我们需要@Eric :) 和做出快速/最简单的选择。

编辑:实际上,在我之前
的想法中,更多的是关于每个执行的“工作” - 而智能感知(作为完成“服务”)必须向您提供列表中的所有选择(属性名称和类型) (我没有看到它们都存在,而是一个猜测。并且有一个选择来涵盖两者可能会很痛苦)
所以为了区分它添加了完全限定的名称。
它“失败”的地方(有点)是最后“粘贴”了“短版”——我确实应该这么想。

于 2012-04-30T14:58:39.780 回答
2

我发现如果我输入element.HorizontalAlignment =,那么 VS2010 会自动建议System.Windows.HorizontalAlignment如果你按下 tab 键将被选中。如果不按 Tab 键,而是键入“Ho”来缩小列表,然后按 Tab,您将得到 Horizo​​ntalAlignment。

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

HorizontalAlignment.Center
HorizontalAlignment.Left
HorizontalAlignment.Stretch
HorizontalAlignment.Right
于 2012-04-25T10:30:55.953 回答
1

这是编译器比 Intellisense 更智能的情况。

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

于 2012-04-28T05:01:13.117 回答
0

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

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

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

于 2012-04-29T19:51:14.180 回答