字段初始值设定项不能引用非静态字段,方法或属性

时间:2011-12-03 10:12:51

标签: c# visual-studio visual-studio-2010

好的,所以我有下面的代码,从技术上讲它所做的就是逐行读取db.txt文件,然后假设将行0拆分成一个名为password的数组。

private string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
private string[] password = lines[0].Split(' ');

但是我收到了错误:

  

字段初始值设定项不能引用非静态字段,方法或属性

4 个答案:

答案 0 :(得分:4)

考虑上述含义以及您希望如何填充这些变量。您需要首先构造它们所属的类,然后希望代码行按您希望的顺序执行,并且它们不会抛出异常。

编译器有效地告诉你这不是正确的做事方式。

更好的方法是简单地编写一个函数来做你想做的事情:

private string[] PasswordLines(){
  string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
  return lines[0].Split(" "); 
}

然后您可以从任何您想要的地方拨打电话;例如:

public class MyClass()
{
 private string[] Lines 
 {
   get { return PasswordLines(); }
 }

 private string[] PasswordLines(){
  string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
  return lines[0].Split(" "); 
 }

}

答案 1 :(得分:4)

在提交初始化时,C#不保证任何特定的执行顺序 例如,这两行代码将产生未定义的结果:

private int a = b + 1;
private int b = a + 1;
理论上,两种可能的结果是a = 1,b = 2或a = 2,b = 1,但事实上它甚至是最差的。我们甚至不知道a和b是否初始化为它们的默认值(在int的情况下为0),因此它可以是任何东西(就像对未初始化对象的引用一样)。 为了避免这种无法解决的问题,编译器要求所有字段初始化都是“运行时常量”(每次执行时返回相同的值,无论何时执行它们并独立于任何其他非“运行时常量”变量)。

初始化复合字段时只需使用构造函数,生活就会再次变得甜美。

答案 2 :(得分:2)

究竟是什么说的!那些是(实例)字段初始化器,并且不能相互引用。将代码移动到构造函数中,或者将它们变为方法变量而不是字段。

答案 3 :(得分:1)

错误是不言自明的。

你不能这样做,因为行和密码都是字段变量,你不能指定

其中一个对其他人有价值(如果它是静态的那么你可以)。

我希望你在一个类中使用这个代码,所以除非一个对象没有创建它们没有这些字段变量的真实存在,所以你不能将它们分配给彼此。