0
enum SameName { Value }
class Tester
{
   void Method1() {
      SameName SameName;
      SameName test = SameName.Value;
   }
   void Method2() {
      string SameName;
      SameName test = SameName.Value;
   }
}

最初の方法では、コンパイラは、SameName.Value が列挙型を参照していることを正しく判断します。

2 番目の方法では、コンパイラが混乱し、SameName.Value が文字列クラスの Value メンバーを参照していると見なします。そのようなメンバーは存在しないため、エラーになります。

このコンテキストで、コンパイラが SameName 列挙型をより認識できるようにするにはどうすればよいですか? ステートメントを使用してこれを行う方法はありますか?

  • 実際のコードで変数または列挙型の名前を変更できません。
  • 多くの列挙値を持つ大きな辞書を作成していますが、列挙型の各インスタンスの前に名前空間プレフィックスを追加したくありません。

更新:はい、大文字のローカル変数を使用すべきではないことはわかっています。はい、これらはフィールドではなくローカル変数であることを認識しています。はい、実際のコードがこのように見える場合、これをデバッグするのはひどいことだと思います。上記は、私が実際のコードで抱えている問題を示す短い不自然な例として書きました。意図を明確に伝えていなかったことをお詫び申し上げます。実際のコードでは、クラスは列挙型の名前空間に含まれる名前空間にあり、ローカル変数は基本クラスのプロパティです。問題を見つけやすくするために無関係なコードをすべて削除しようとし、問題の範囲を少し広げるために要件をリストしました。

4

5 に答える 5

2

C# は、型と同じ名前のプロパティに直面しても堅牢になるように設計されています。これはよくあることです。

class Shape
{
    public Color Color { get; set; }
    ...

タイプ Color がある場合、Color という名前のプロパティを持つことは非常に一般的であり、どちらの名前も変更する良い方法はありません。したがって、C# は、この状況を適度にエレガントに処理するように設計されています。色 色の問題に関するいくつかの興味深い詳細については、私の 2009 年の記事を参照してください。

http://blogs.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx

C# は、宣言されているものがローカルである場合の色の色の問題を処理するようには設計されていません。ローカルの名前を変更します

于 2013-04-12T16:30:44.200 に答える
2

わかりました。あなたの更新に基づいて、私たちはあなたを助けることができると思います. 今の状況はより理にかなっています。コードがあると思います:

// in a place you're not allowed to edit
namespace Outer
{
  public enum SameName { Value, }
}

// in a place you're not allowed to edit
namespace BaseSpace
{
  public class TesterBase
  {
    public string SameName { get; set; }
  }
}

そして、編集可能な 3 番目のコード ファイルに問題があります。タイプを指すusingエイリアスディレクティブで解決することをお勧めします。そうすれば、完全な名前空間を何度も繰り返す必要がなくなります。次のようになります。

using BaseSpace;
using snEnum = Outer.SameName;          // this helps you (a using alias)

namespace Outer.Inner
{
  public class Tester : TesterBase
  {
    void Method2() {
      snEnum test = snEnum.Value;
    }
  }
}

エイリアス ディレクティブを使用すると、名前空間または型のいずれかを「指す」ことができることに注意してください (この場合のように)。彼らは、あなたがよく使う面倒な名前の省略形を与えます.

于 2013-04-12T18:01:51.770 に答える
1

sameNameこのような理由から、ローカル変数の命名規則を使用する方がはるかに優れています。完全な例を次に示します。

enum SameName { Value }
class Tester
{
   void Method1() {
      SameName sameName;
      SameName test = SameName.Value;
   }
   void Method2() {
      string sameName;
      SameName test = SameName.Value;
   }
}

フィールドの名前を変更することはできないと言いますが、例ではローカル変数が示されています。フィールドは非公開にする必要があり、大文字で始めてはならないという慣例があります。ローカル変数とプライベート フィールドは、まれな例外 (リフレクションなど) を除いて、必要に応じて常に名前を変更できます。

要するに、適切な方法を使用すれば、この問題は発生しません。

于 2013-04-12T16:25:44.367 に答える