99

静的クラス内で静的辞書オブジェクトを宣言する方法は? 私は試した

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
    {
        { "1", "User name or password problem" }     
    };
}

しかし、コンパイラは「文字列以外の参照型の const フィールドは null でしか初期化できない」と文句を言います。

4

10 に答える 10

241

ディクショナリを一度宣言して変更しない場合は、読み取り専用として宣言します。

private static readonly Dictionary<string, string> ErrorCodes
    = new Dictionary<string, string>
{
    { "1", "Error One" },
    { "2", "Error Two" }
};

ディクショナリ項目 (参照だけでなくコレクション内の項目も) を読み取り専用にする場合は、IDictionary を実装する読み取り専用ディクショナリ クラスを作成する必要があります。

参照用に ReadOnlyCollection を確認してください。

BTW const は、スカラー値をインラインで宣言する場合にのみ使用できます。

于 2008-11-24T03:30:42.470 に答える
8

正しい構文 (VS 2008 SP1 でテスト済み) は次のとおりです。

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic;
     static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}
于 2008-11-24T03:23:42.950 に答える
5

古い質問ですが、これは便利だと思いました。結局のところ、キーと値の両方に文字列を使用する辞書専用のクラスもあります。

private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary
{
    { "1", "Unrecognized segment ID" },
    { "2", "Unexpected segment" }
};

編集:以下のChrisのコメントによると、一般的にはDictionary<string, string>overを使用StringDictionaryすることをお勧めしますが、状況によって異なります。古いコードベースを扱っている場合は、に制限される可能性がありますStringDictionary。また、次の行に注意してください。

myDict["foo"]

myDictがの場合はnullを返しますが、の場合はStringDictionary例外がスローされDictionary<string, string>ます。この編集のソースである詳細については、彼が言及したSOの投稿を参照してください。

于 2011-03-29T15:08:17.720 に答える
1

最初の例の問題は、主に;constではなくの使用によるものでした。staticC# で null 以外の const 参照を作成することはできません。

これもうまくいったと思います:

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic
        = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
}

また、Y Low が指摘しているように、追加readonlyも同様に良い考えであり、ここで説明する修飾子のどれも辞書自体の変更を妨げるものではありません。

于 2008-11-24T03:38:42.640 に答える
0

OK - だから私は ASP 2.x で作業しています (私の選択ではありませんが、誰が愚痴を言っているのですか?)。

初期化辞書の例はどれも機能しません。それから私はこれに出くわしました: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

...これは、ASP 2.x ではコレクションの初期化を使用できないという事実に私を悩ませました。

于 2010-05-25T17:17:53.257 に答える
0

辞書を静的にし、静的オブジェクトの ctor の外に追加しないでください。これは、C# の static/const ルールをいじるよりも簡単な解決策のようです。

于 2008-11-24T03:21:40.553 に答える
0

static/class コンストラクターを使用して、辞書を初期化できます。

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic;
    public static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}
于 2008-11-24T03:13:39.883 に答える
-2
public static class ErrorCode
{
    public const IDictionary<string , string > m_ErrorCodeDic;

    public static ErrorCode()
    {
      m_ErrorCodeDic = new Dictionary<string, string>()
             { {"1","User name or password problem"} };             
    }
}

おそらくコンストラクタで初期化します。

于 2008-11-24T03:11:50.137 に答える