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

あなたがWPF環境で働いていて(私は要素を見る)、どういうわけかSystem.Windows.Formsdllへの参照を持っていると思います。

HorizontalAlignment私の推論は、両方の名前空間に見られる事実に基づいています。

System.Windows.Forms.Horizo​​ntalAlignment

System.Windows.FrameworkElement.Horizo​​ntalAlignment

同じタイプを指す2つの参照がある場合、正確に意味するVS名前空間を指定するように求められます。

于 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;
        }
    }
}

MyEnumおよびTestEnumプロパティ(ターゲット列挙型)は両方ともTestEnum「完全修飾」名を提供します(他はプロパティタイプとは異なる名前ですが、タイプは他のプロパティの名前と一致するため、両方とも「汚染」されます)-SndTestEnumは異なる名前(タイプ、プロパティ)を持ち、どちらの場合でも問題なく動作します。

...面白いことに、すべてを削除namespace MyCallerNSして「長い名前名」の下に置いてもAndSomeMore.、前に追加されます。

私が見ているように解決策はありません(Re#とサードパーティのツールが不足しています)。@ Rickが示唆した
ように、これはインテリセンスが当てはまらないようです。as smart as the compiler

むしろ、コンパイラは(すべての情報を手元に置いて)物事を解決するのに時間がかかりますが、インテリセンスにはその「深さ」と物事への洞察がありません(私は推測しています、本当に単純化しています-これには@Ericが必要です:)そしてある種の高速/最も簡単な選択を行います。

編集:実際、私の以前
の考えでは、それぞれが実行する「ジョブ」に関するものであり、インテリセンス(補完「サービス」として)は、リスト内のすべての選択肢(プロパティ名とタイプの両方)を提示する必要があります(両方が存在することはわかりませんが、推測です。両方をカバーするための1つの選択肢があると、処理が面倒になる可能性があります)
したがって、区別するために、完全修飾名が追加されます。
そして、それが「失敗する」(ある種の)のは、最後に「短いバージョン」を「貼り付ける」ことです。これは確かに私が考える必要があります。

于 2012-04-30T14:58:39.780 に答える
2

入力すると、タブキーを押すelement.HorizontalAlignment =とVS2010が自動的にSystem.Windows.HorizontalAlignmentどちらを選択するかを提案します。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

上記の回答に加えて、MicrosoftOfficeオートメーションが関与するプロジェクトがいくつかありました。私のクラスは次のように構成されていました

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

.NET Framework自体のMicrosoft名前空間内の何かにアクセスしようとすると、Intellisenseは名前を完全に修飾するように強制します。ルートの競合の場合は、次のようにグローバルキーワードも先頭に追加しますglobal::Windows.Forms.etc...

于 2012-04-29T19:51:14.180 に答える