我一直在尝试让这门课上班。当我从所有方法中删除静态时,该类可以工作,但是我无法从另一个类调用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);
}
}}
为什么我收到此错误?
答案 0 :(得分:2)
display()
不应该是静态的,因为当您显示曲目列表时,您打算显示曲目列表的实例。将其设置为静态意味着您通常会显示轨道列表的概念,而不是特定的轨道列表。
这也是您收到此错误的原因。您正在通过调用new Tracklist()
创建曲目列表实例,但trackName
不是曲目列表的属性。它是静态的,使其成为一般轨道列表概念的属性。每个曲目列表没有trackName,世界上只有一个曲目名称!
如果trackName
保持静态,则表示tracklist1.trackName
是非法的。只有Tracklist.trackName
,因此世界上只有一个曲目名称。
答案 1 :(得分:0)
你有这个子表达式:
new Tracklist() {trackName=track, minutes=Minutes, seconds=Seconds}
但属性trackName
,minutes
,seconds
是 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>();
}
}
非静态构造函数是错误的来源。