静态字段或属性不能在对象初始化项中分配.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);
}
}}
为什么我得到这个错误?
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>();
}
}
非静态构造函数是错误的来源