字段初始化项不能引用非静态字段、方法或属性

本文关键字:字段 方法 属性 静态 初始化 不能 引用 | 更新日期: 2023-09-27 18:16:39

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

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

但是我得到错误:

字段初始化项不能引用非静态字段、方法或属性

字段初始化项不能引用非静态字段、方法或属性

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

编译器实际上是在告诉你这样做不对。

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

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(" "); 
 }
}

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

private int a = b + 1;
private int b = a + 1;

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

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

就是这么说的!它们是(实例)字段初始化器,不能相互引用。将代码移到构造函数中,或者使它们成为方法变量而不是字段。

错误自解释

不能这样做,因为lines和password都是字段变量,你不能赋值

其中一个值与另一个值相等(如果是静态的,则可以)。

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