使用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; }
}
}
答案 0 :(得分:6)
我假设您正在WPF
环境中工作(我看到了元素),并且以某种方式引用了System.Windows.Forms
dll。
我的推论基于以下事实: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;
}
}
}
MyEnum
和TestEnum
属性(定位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键,您将获得HorizontalAlignment。
如果您能够使用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...
。