所以我有一个功能:
List<string> names = new string();
private static void getName(string name)
{
names.add(name);
}
当我尝试编译时,我得到一个: '非静态字段'通知需要“对象引用”。 我该怎么做才能使这个成员(名称)与getName兼容?
我需要它是非静态的或转换的,因为我想将结果放入其他非静态函数和表单中。
答案 0 :(得分:10)
您需要告诉系统您感兴趣的名称列表。它是对象状态的一部分,是类的实例......但是哪一个?也许您已经创建了该类的几个实例 - 也许您已经创建了该类的 no 实例。静态方法没有可见性 - 那么您希望它从哪个实例获取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
更改为静态顺便说一句,对于添加名称的东西,这是一个非常奇怪的方法名称。这也有些不同寻常......
答案 1 :(得分:2)
如果要从静态方法中使用它,则需要使names
为静态:
// If this is static, you can use it from your static method
static List<string> names = new List<string>();
问题是getName
在您的类型上定义了,而不是在该类型的实例上定义。但是,names
已定义,因此您的类型的每个实例都会获得自己的值。
答案 2 :(得分:1)
names
是一个对象,它将存在于类的实例中,例如MyClass mc = new MyClass();
然后您可以访问mc.names
。可以使用类名调用静态字段而不使用类的实例,例如MyClass.getName("");
会奏效。因此,当您在逻辑上思考时,该类不包含名称,只有“该类的实例”包含它。因此,您要么将该列表设置为静态,并且当您调用MyClass.names
或将getName方法设置为非静态时,它将是“相同的List实例”,并且它将仅从实例调用,因此不会{{ 1}}是可能的,但MyClass.getName("")
这是你正在努力做的事情。
答案 3 :(得分:0)
静态方法无法访问类字段。要么使名称为静态,要么使getName()非静态。你是什么意思“兼容”。问问自己......这个方法需要是静态的吗?它的目的是什么,你打算如何使用它?
答案 4 :(得分:0)
您无法以这种方式访问它,您需要实例化包含成员的类。