3

重複
の可能性: 非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です

非静的フィールドがあります:

private IDictionary<string, string> _mappings = 
    new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)

次のようなアクション内で使用したい:

public static string GetMimeType(string extension)
{
    //...
    return _mappings.TryGetValue(extension, out mime) ? 
        mime : "application/octet-stream";
}

コンパイラは不平を言っています:

return ステートメントの非静的フィールド、メソッド、またはプロパティには、オブジェクト参照が必要です。

このフィールドを参照するにはどうすればよいですか?

4

3 に答える 3

19

静的メンバーからインスタンス メンバーにアクセスすることはできないため、2 つの選択肢があります。

  1. メソッドをインスタンス メソッドにする (staticキーワードを削除する)
  2. フィールドを静的にする (staticキーワードを追加)

どちらを選択するかは、フィールドをすべてのインスタンスで共有するかどうかによって異なります。

于 2013-01-03T14:59:53.943 に答える
1

コンパイラはここでかなり明確だと思います: GetMimeType メソッドは静的メソッドですが、_mappings 変数は静的と宣言されていません (非静的またはインスタンス フィールド/変数)。

上記のように mappings 変数を使用する場合は、次のようにします。

private static IDictionary<string, string> _mappings = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)

編集:コメンターが以下で指摘したように、これが実際に必要な動作であることに注意する必要があります。静的メンバーは、すべてのインスタンスがこの同じマッピング変数を共有し、存在するデータを上書きできることを意味します。クラスごとに 1 つのマッピング変数が必要な場合は、上記の回答に記載されているように、メソッドをインスタンス メソッドに変更する必要があります ( static キーワードを削除して)。

于 2013-01-03T15:01:50.863 に答える
0

一度入力された後は変更されない値の辞書が必要な場合は、辞書を静的にして静的コンストラクターに入力することができます。

于 2013-01-03T15:10:56.400 に答える