无法在对象初始值设定项中分配静态字段或属性。 C#

时间:2014-03-09 04:39:18

标签: c# static visual-studio-2013

我一直在尝试让这门课上班。当我从所有方法中删除静态时,该类可以工作,但是我无法从另一个类调用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);
    }       
}}

为什么我收到此错误?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

你有这个子表达式:

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

但属性trackNameminutesseconds static 属性。因此,他们不属于您创建的新Tracklist 实例。错误消息很明确:

  

无法在对象初始值设定项中分配静态字段或属性。

&#34;对象初始化程序&#34;是一个表达式(例如):

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

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

答案 2 :(得分:-1)

我同意display()不应该是静态的另一个答案。但如果是这样的话,那么你班上的其他人也不应该是静态的。我假设你正试图在这里实施一个单身人士。首先,如上所述,trackName,minutes和seconds不能是静态的。但是你可以添加一个静态构造函数来初始化你的单个实例:

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

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