C#和OOP很新。我正在尝试创建一个名为" Human"用一些信息初始化。但是我收到以下错误a field initializer cannot reference the nonstatic field method or property
。尝试创建full_name
变量时,错误消息指向 first_name 和 last_name
继承人"简单"代码
namespace World
{
public class Human
{
// Personal traits
public string first_name;
public string last_name;
public string full_name = first_name + " " + last_name;
}
}
我究竟做错了什么?我不明白..
答案 0 :(得分:2)
您可以将其实现为在其getter中返回计算字符串的Property
namespace World
{
public class Human
{
// Personal traits
public string first_name;
public string last_name;
public string full_name { get { return first_name + " " + last_name}};
}
}
您是否有理由使用这种方式编写成员名称?通常我会这样做:
namespace World
{
public class Human
{
// Personal traits
public string FirstName {get; set;}
public string LastName {get; set;}
public string FullName => $"{FirstName} {LastName}"; // C#7 notation notation
}
}
使用PascalCasing的公共属性,私有的camelCasing根据MS是“正常的”,甚至会在VS2017中产生提示
答案 1 :(得分:2)
它不起作用的原因是因为您的所有属性都是非静态,这意味着它们是实例值。因此,它们将被设置在所创建的类的每个新实例上。想象一下,你的新课程
因此,您显示的代码将在第2步中运行。此时没有this
,还没有实例可供引用。但那就是你说的话。
Public String FullName = FirstName + LastName;
这将更完全合格为
Public String FullName = this.FirstName + this.LastName
这仍然不正确,但它更具描述性并显示了真正的问题。在这行代码运行的时候还没有自我/这个参考。
<强>溶液强> 你有很多选择。帕特里克·阿特纳在他的回答中很好地介绍了最佳解决方案。