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 变量未声明为静态(非静态或实例字段/变量)。

如果要使用上面显示的映射变量,请执行以下操作:

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

编辑:正如评论者在下面指出的那样,您必须小心这实际上是您想要的行为。静态成员意味着所有实例都将共享这个相同的映射变量,并且可以覆盖存在的数据。如果您希望每个类有一个映射变量,那么您应该将您的方法更改为实例方法(通过删除 static 关键字),如上面的答案中所述。

于 2013-01-03T15:01:50.863 回答
0

如果您只想要一个填充一次并且此后不再修改的值字典,那么您可以做的是将字典设为静态并将其填充到静态构造函数中。

于 2013-01-03T15:10:56.400 回答