静态字段或属性不能在对象初始化项中分配.c#

本文关键字:初始化 分配 对象 字段 属性 不能 静态 | 更新日期: 2023-09-27 17:49:17

我一直在努力让这类工作。当我从所有方法中删除static时,类工作,但我无法从另一个类调用display()。为了调用display(),我必须将其与类中的其他所有内容一起设置为静态。现在我得到一个错误"静态字段或属性'trackName'不能在对象初始化器中分配"对于这行代码:tracklist.Add(new Tracklist() {trackName=track, minutes=Minutes, seconds=Seconds});我也得到错误与'分钟'和'秒'。

下面是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.IEnumerable;
namespace Music
{
class Tracklist
{
    public static string trackName { get; set; }
    public static int minutes { get; set; }
    public static int seconds { get; set; }
    //public string strng { get; set; }
    public static List<Tracklist> tracklist = new List<Tracklist>();
    //public static List<string> TrackListString = new List<string>();
    //public static string[] popper;
    public Tracklist()
    {
        //public List<Tracklist> tracklist = new List<Tracklist>();
        display();
    }
    public static void add(string track, int Minutes, int Seconds)
    {
        //string strng = Track.Track(track,Minutes,Seconds);
        tracklist.Add(new Tracklist() {trackName=track, minutes=Minutes, seconds=Seconds});
        //tracklist.Add(trackName=track, minutes=Minutes, seconds=Seconds);
        //new Tracklist() { strng };
    }
    public static int count()
    {
        return tracklist.Count;
    }
    public static string ToString()
    {
        int i=0;
        string[] holder=new string[count()];
        string c = "";
        foreach(object strng in tracklist)
        {
            string a = Track.Track(trackName, minutes, seconds);
            string b = (Convert.ToString(i+1) + ") " + a + Environment.NewLine);
            c = c + b;
            //TrackListString.Add(new string() { strng = b });
            holder[i] = b;
            i++;
            //return b;
        }
        return c; 
    }
    public static string getTrackAt(int i)
    {
        //string TrackAtI= tracklist.[i].trackName; // not sure what is heppening here
        string test = tracklist.ElementAt(i).trackName;
        return test;
    }
    public static void display()
    {
        string holder = ToString();
        Console.Write(holder);
    }       
}}

为什么我得到这个错误?

静态字段或属性不能在对象初始化项中分配.c#

display()不应该是静态的,因为当您显示曲目列表时,您打算显示曲目列表的实例。将其设置为静态将意味着您一般地显示曲目列表的概念,而不是特定的曲目列表。

这也是你得到这个错误的原因。您正在通过调用new Tracklist()创建一个曲目列表实例,但是trackName不是曲目列表的属性。它是静态的,使它成为一般曲目列表概念的属性。每个曲目列表没有trackName,世界上只有一个曲目名称!

如果trackName保持静态,则表示tracklist1.trackName是非法的。只有Tracklist.trackName,所以世界上只有一个音轨名称

你有这个子表达式:

new Tracklist() {trackName=track, minutes=Minutes, seconds=Seconds}

,但属性trackName, minutes, seconds static 属性。因此它们不属于您创建的新Tracklist 实例。错误信息很清楚:

静态字段或属性不能在对象初始化器中赋值。

"对象初始化式"是一个表达式,如(示例):

new NameOfType() { Property1 = expr1, Property2 = expr2, }

创建该类型的一个新实例(一个新对象),并设置该类型的每个属性。因此属性必须是实例属性,也就是非静态属性。

我同意另一个答案,display()不应该是静态的。但如果是这种情况,那么类的其余部分也不应该是静态的。我假设你要实现一个单例。首先,正如上面提到的,trackName、分和秒不能是静态的。但是您可以添加一个静态构造函数来初始化您的单个实例:

static class TrackList
{
    static TrackList()
    {
        tracklist = new List<TrackList>();
    }
}

非静态构造函数是错误的来源