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

C# 字段初始值设定项不能引用非静态字段、方法或属性,c#,visual-studio,visual-studio-2010,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(' '); 但我得到了一个错误: 字段初始值设定项不能引用非静态字段、方法或属性 正是他说的!这些是(

好的,我有下面的代码,从技术上讲,它所做的只是逐行读取
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),所以它可以是任何东西(就像对未初始化对象的引用)。 为了避免这种无法解决的情况,编译器要求所有字段初始化都是“运行时常量”(每次执行时都返回相同的值,并且与任何其他非“运行时常量”变量无关)


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

错误是不言自明的

您不能这样做,因为行和密码都是字段变量,您不能分配

其中一个值对另一个值(如果它是静态的,那么您可以)

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