c# - 字段初始值设定项无法引用非静态字段方法或属性

时间:2017-11-25 15:06:40

标签: c#

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;
    }
}

我究竟做错了什么?我不明白..

2 个答案:

答案 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)

它不起作用的原因是因为您的所有属性都是非静态,这意味着它们是实例值。因此,它们将被设置在所创建的类的每个新实例上。想象一下,你的新课程

  1. 分配了Memorey
  2. 设置默认属性
  3. 构造函数名为
  4. 因此,您显示的代码将在第2步中运行。此时没有this,还没有实例可供引用。但那就是你说的话。

    Public String FullName = FirstName + LastName;
    

    这将更完全合格为

    Public String FullName = this.FirstName + this.LastName
    

    这仍然不正确,但它更具描述性并显示了真正的问题。在这行代码运行的时候还没有自我/这个参考。

    <强>溶液 你有很多选择。帕特里克·阿特纳在他的回答中很好地介绍了最佳解决方案。