繁体   English   中英

不能在对象初始化器中分配静态字段或属性。 C#

[英]Static field or property cannot be assigned in an object initializer. C#

我一直在努力使这堂课上班。 当我从所有方法中删除静态方法时,该类可以工作,但无法从其他类中调用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);
    }       
}}

为什么会出现此错误?

display()不应是静态的,因为在显示轨道列表时,您打算显示一个轨道列表的实例。 将其设置为静态将意味着您通常显示轨道列表的概念,而不是特定的轨道列表。

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

如果trackName保持静态,则表示tracklist1.trackName非法。 只有Tracklist.trackName ,因此世界上只有一个轨道名称。

您具有以下子表达式:

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

但是属性trackNameminutessecondsstatic属性。 因此它们不属于您创建的新Tracklist 实例 错误消息很清楚:

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

“对象初始值设定项”是类似于(示例)的表达式:

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

它创建该类型的新实例(新对象),并在该类型上设置每个属性。 因此,这些属性一定是实例属性,也就是非静态属性。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM