[英]asp.net c# - A field initializer cannot reference the non-static field, method or property
[英]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}
但是属性trackName
, minutes
和seconds
是static
属性。 因此它们不属于您创建的新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.