1

次のクラスを作成しました。

using System.Windows;
using System.Windows.Input;
using MyUtils.MyArgParser;

namespace MyUtils.MyImplement
{
    public static class ImplementExitOnEscape
    {
        #region ImplementExitOnEscape

        public static void Implement(Window window)
        {
            window.KeyDown += Window_KeyDown;
        }

        private static void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var window = sender as Window;
            // Close window when pressing the escape key.
            if (e.Key == Key.Escape) if (window != null) window.Close();

            var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX");
        }

        #endregion //ImplementExitOnEscape
    }
}

ではなく、MyArgParserクラスの完全な名前空間を使用する必要があるのはなぜですか?var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX");MyArgParser.GetOptionValue("optionX");

using MyUtils.MyArgParser;無視されます。そこにあってもなくても違いはありませんが、コンパイラは依然として完全な名前空間を使用するように強制します。

どこでも起こっているわけではないので、これは奇妙だと思います。たとえば、アプリケーションのエントリ ポイントが定義されているファイルで完全な名前空間を使用する必要はありません。

4

4 に答える 4

7
var optionX = MyArgParser.MyArgParser.GetOptionValue("optionX"); 

クラスは名前空間として名前が付けられているため、それらを区別するには、明示的に完全に参照する必要があります。

それを解決するには、MyArgParser 名前空間を (たとえば) MyArgParserNS に変更し、それを直接使用できます。

using MyUtils.MyArgParserNS

その後:

var optionX = MyArgParser.GetOptionValue("optionX"); 

または、まあ、それを完全に参照してください。

于 2012-09-22T14:46:13.993 に答える
6

問題は、名前空間と同じ名前のクラスがあることです。つまり、コンパイラは MyArgParser.GetOptionValue の MyArgParser が名前空間かクラスかを区別できません。

各ファイルの先頭にある異なる using ステートメント、または名前がクラス名と衝突するフィールドまたは変数のために、完全な名前空間を使用する必要がある場合とそうでない場合があります。詳細については、このテーマに関する Eric Lippertのブログ投稿(およびパート2、3、および4 ) を参照してください。

Technology.Technology など、クラスとその名前空間に同じ名前を付けないようにする方法を参照してください。これについての詳細な議論のために。

于 2012-09-22T14:46:13.080 に答える
1

宣言usingの外にディレクティブがあります。コンパイラは、次の場所で型または名前空間を次の順序でnamespace検索します。

  1. MyUtils.MyImplement.ImplementExitOnEscape(現在の型内にネストされた型)
  2. MyUtils.MyImplement(現在の名前空間の型または名前空間)
  3. MyUtils(「次の」外部レベルの型または名前空間)
  4. null 名前空間またはグローバル名前空間 (型または名前空間)
  5. System.WindowsSystem.Windows.Input、および(型または名前空間) の s がMyUtils.MyArgParserあることusing

MyArgParser.<something>を入力しました。

( 3.)で一致が見つかり、それが名前空間です。(5.) でのみusing問題になります。したがってMyArgParser、型ではなく名前空間を参照します。

usings をnamespaceブロック内に配置していた場合、状況は異なっていたはずです。別のスレッドで私の回答を参照してください。

于 2013-05-18T19:33:32.410 に答える
0

いくつかの理由が考えられます:

  1. 別の名前との競合

  2. あなたのクラスはさらに別の名前である可能性があります。

Ctrl+J+K を使用して、クラスを検索します。VSがそれを見つけるかどうかを確認してください。そうでない場合は、参照の問題が原因である可能性があります。そのライブラリへの参照を追加する必要がありますか?

于 2012-09-22T14:46:59.590 に答える