C#访问静态函数中的非静态成员

所以我有一个function:

List names = new string(); private static void getName(string name) { names.add(name); } 

当我尝试编译时,我得到一个:’非静态字段’通知需要’对象引用。 我该怎么做才能使这个成员(名称)与getName兼容?

我需要它是非静态的或转换的,因为我想将结果放入其他非静态函数和表单中。

你需要告诉系统你感兴趣的名字列表。它是一个对象状态的一部分,一个类的实例……但是哪一个? 也许你已经创建了几个类的实例 – 也许你没有创建类的实例。 静态方法没有可见性 – 那么您希望它从哪个实例获取names变量值?

再举一个例子,假设我们有一个这样的类:

 public class Person { public double MassInGrams { get; set; } public double HeightInMetres { get; set; } public static double ComputeBodyMassIndex() { // Which person are we interested in? } } Person p1 = new Person { MassInGrams = 76203, HeightInMetres = 1.8 }; Person p2 = new Person { MassInGrams = 65000, HeightInMetres = 1.7 }; double bmi = Person.ComputeBodyMassIndex(); 

你期望结果是什么? 您已经要求Person类计算“BMI”,但没有告诉它要计算哪个BMI。 你需要给它那些信息。

一些选择适合您的情况:

  • names更改为静态
  • 将方法更改为实例方法
  • 传入类的实例
  • 创建类的实例,可能返回它
  • 以其他方式获取类的实例

顺便说一句,对于添加名称的东西,这是一个非常奇怪的方法名称。 这也有些不同寻常……

如果要从静态方法内部使用names则需要将names设为静态:

  // If this is static, you can use it from your static method static List names = new List(); 

问题是getName在您的类型上定义的,而不是在类型的实例上定义的。 但是,定义了names ,因此您的类型的每个实例都有自己的值。

names是一个将存在于类实例中的对象,例如MyClass mc = new MyClass(); 然后你可以访问mc.names 。 可以使用类名调用静态字段而不使用类的实例,例如MyClass.getName(""); 将工作。 因此,当您在逻辑上思考时,该类不包含名称,只有“该类的实例”包含它。 因此,您要么将该列表设置为静态,并且当您调用MyClass.names或将getName方法设置为非静态时,它将是“相同的List实例”,并且它将仅从实例调用,因此不会MyClass.getName("")是可能的,但是mc.getName(""); 这是你正在努力做的事情。

静态方法无法访问类字段。 要么使名称为静态,要么使getName()为非静态。 你是什​​么意思“兼容”。 问问自己……这个方法需要是静态的吗? 它的目的是什么,你打算如何使用它?

你无法以这种方式访问​​它,你需要实例化包含成员的类。