C#错误:字段初始值设定项无法引用非静态字段方法或属性

时间:2016-01-23 15:08:02

标签: c#

我正在使用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

    }
}

4 个答案:

答案 0 :(得分:3)

创建一个构造函数并在那里指定字段:

public string[] postfixList;

public ValueObj()
{
  postfixList = postfix("postfixList");
}

postfix方法的返回类型必须为string[]而不是void

字段postfixList是类的实例成员,不是静态的。对postfix()的调用在方法之外,因此是静态的。如果在构造函数中调用它,则每次实例化类时都会调用它。

有关staticinstance成员之间的差异,请参阅示例https://msdn.microsoft.com/aa645629(v=vs.71).aspx

答案 1 :(得分:2)

必须在没有instance的{​​{1}}的情况下分配字段初始值设定项。

你得到了这个错误,因为你的:

class

假设 public string[] postfixList = postfix("postfixList"); ValueObj个实例已存在,并致电class(因为postfixpostfix {instance的一部分1}},而不是ValueObj class的一部分),而事实上它在召唤时尚未存在。

有两种方法可以解决这个问题,一种方法是在构造函数中初始化ValueObj(另一个答案显示)。

作为替代答案,除了在class构造函数中初始化postfix之外,如果postfix方法对于所有ValueObj个实例都相同,那么您可以请将其声明为postfixValueObj,如下所示:

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)

您的代码中存在许多错误。

  1. 类ValueObj应该是公共类ValueObj。是的,班级可以 私人在c#
  2. public void postfix(string table){...}返回void。这意味着一个 功能不会返回一个东西。你不能用它来设置值 public string [] postfixList。它应该返回一个字符串数组。
  3. postfixList也不是静态属性。这意味着只有在初始化类ValueObj时才会初始化它。

    问题出在类生命周期中,在创建对象之前,类属性不存在(除非是静态)。在您创建对象值OBJ FIRST的情况下,它尝试初始化所有属性,然后调用类构造函数。您的属性postfixList尝试调用尚未构造的类方法。

    如果你想让它看起来像c#代码那样做:

    public class ValueObj{
    
        private string[] _postfixList;
    
        public string[] PostfixList{ get{
            if(_postFixList == null){
                _postFixList = postfix("postfixList")
            }
            return _postfixList
        }}
    }