我正在使用PHP代码而且我对C#没有太多经验,我经常修改我的代码,但仍然遇到错误" 字段初始化程序无法引用非静态字段,方法或属性 "在行号 34 为什么总是发生以及如何解决?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Finisar.SQLite;
namespace Stemmer
{
class ValueObj
{
public void postfix(string table)
{
SQLiteConnection sqlite_conn;
SQLiteCommand sqlite_cmd;
SQLiteDataReader sqlite_datareader;
sqlite_conn = new SQLiteConnection("Data Source=database.db;Version=3;New=False;Compress=True;");
sqlite_conn.Open();
sqlite_cmd = sqlite_conn.CreateCommand();
sqlite_cmd.CommandText = "SELECT * FROM " + table;
sqlite_datareader = sqlite_cmd.ExecuteReader();
List<string> list = new List<string>();
while (sqlite_datareader.Read())
{
list.Add(sqlite_datareader.GetString(1));
}
return list.ToArray(); // returns void, a return keyword must not be followed by an object expression
}
public string[] postfixList = postfix("postfixList"); // A field initializer cannot reference the non-static field, method, or property
}
}
答案 0 :(得分:3)
创建一个构造函数并在那里指定字段:
public string[] postfixList;
public ValueObj()
{
postfixList = postfix("postfixList");
}
postfix
方法的返回类型必须为string[]
而不是void
字段postfixList
是类的实例成员,不是静态的。对postfix()
的调用在方法之外,因此是静态的。如果在构造函数中调用它,则每次实例化类时都会调用它。
有关static
和instance
成员之间的差异,请参阅示例https://msdn.microsoft.com/aa645629(v=vs.71).aspx
答案 1 :(得分:2)
必须在没有instance
的{{1}}的情况下分配字段初始值设定项。
你得到了这个错误,因为你的:
class
假设 public string[] postfixList = postfix("postfixList");
ValueObj
个实例已存在,并致电class
(因为postfix
是postfix
{instance
的一部分1}},而不是ValueObj
class
的一部分),而事实上它在召唤时尚未存在。
有两种方法可以解决这个问题,一种方法是在构造函数中初始化ValueObj
(另一个答案显示)。
作为替代答案,除了在class
构造函数中初始化postfix
之外,如果postfix
方法对于所有ValueObj
个实例都相同,那么您可以请将其声明为postfix
和ValueObj
,如下所示:
static
答案 2 :(得分:2)
在C#中,使用方法初始化非静态字段无效。如果您使用的是Visual Studio,则应突出显示此行中的postfix
方法:
public string[] postfixList = postfix("postfixList");
如果需要使用方法,则必须将初始化移至构造函数。
public string[] postfixList;
public ValueObj()
{
postfixList = postfix("postfixList");
}
在声明时初始化时,允许的值是使用值类型的值,例如:
public int myLuckyNumber = 13;
或者,如果初始化引用类型,您可以创建该类型的新实例:
public MyClass myField = new MyClass();
在this thread中,您可以在C#中初始化字段时找到有关最佳做法的更多建议。
与问题无关,但请注意,在C#中,首选格式约定是使用驼峰个案并使用大写字母开始方法的名称。
答案 3 :(得分:1)
您的代码中存在许多错误。
postfixList也不是静态属性。这意味着只有在初始化类ValueObj时才会初始化它。
问题出在类生命周期中,在创建对象之前,类属性不存在(除非是静态)。在您创建对象值OBJ FIRST的情况下,它尝试初始化所有属性,然后调用类构造函数。您的属性postfixList尝试调用尚未构造的类方法。
如果你想让它看起来像c#代码那样做:
public class ValueObj{
private string[] _postfixList;
public string[] PostfixList{ get{
if(_postFixList == null){
_postFixList = postfix("postfixList")
}
return _postfixList
}}
}