【问题标题】:A field initializer cannot reference the nonstatic field, method, or property, setting a variable字段初始值设定项无法引用非静态字段、方法或属性,设置变量
【发布时间】:2017-07-06 09:38:01
【问题描述】:

这里的编码爱好者/爱好者,C# 新手,试图围绕该语言进行思考,几天来一直在这个问题上苦苦挣扎。已尝试在此站点上搜索并阅读 msdn 上有关此错误的文档,以及有关类、字段、初始化等的文档。如果这对其他人来说很明显,我深表歉意,但我已经绞尽脑汁尝试理解这个错误。

我正在编写一个基本的 MUD 游戏(在命令行中运行基于文本的 RPG)作为我的第一个 C# 程序,当我尝试访问怪物统计信息时遇到了一个问题(我已经放入一个名为“Bestiary”的不同命名空间,它将包含所有怪物的统计数据作为它们自己的类)。我尝试了几种不同的方法,但都无法让程序无错误地编译。

using System;
using System.Collections;
using Bestiary;

//Battle system is contained in this namespace.

class Combat(string playerName)
{
  public int[] playerStats= new int[] { 25, 10};
  public int[] monsterStats= new int[] { 10, 10};

  string playerName = playerName;
  Slime s = new Slime();
  string monsterName = s.Name();
...

//Bestiary section being referenced in Combat
using System;
using System.Collections;

namespace Bestiary
{
    //List of Monsters and their stats
    class Slime
    {
        private string name = "Slime";
        public string Name
        {
            get { return name; }

            set { name = value; }
        }

        private int hp = 10;
        public int HP
        {
            get { return hp; }

            set { hp = value; }
        }

        private int atk = 1;
        public int ATK
        {
            get { return atk; }

            set { atk = value; }
        }

    }

当我尝试编译它时,我在“string monsterName = s.Name();”这一行得到错误。

【问题讨论】:

  • Edit_ SO抱歉:.Name 是一个属性,而不是一个方法。 string monsterName = s.Name; - 删除 ()。
  • 您的评论由于某种原因消失了。我已经用构造函数示例更新了我的答案。
  • 对不起,我在更新前发表了评论,然后随着更新将其删除,因此消失了。我目前正在实施更改以查看它是否会编译。感谢您的领导,我完成后会检查!

标签: c#


【解决方案1】:

你应该像这样引用你的史莱姆的名字:

  string monsterName = s.Name;

属性经过专门设计,允许您将逻辑放入 getset“方法”,同时保留读取或写入字段的语法。

另外,将代码放入构造函数中:

class Combat
{
  public int[] playerStats = new int[] { 25, 10};
  public int[] monsterStats = new int[] { 10, 10};
  string playerName;
  string monsterName;

  public Combat(string playerName) 
  {
    this.playerName = playerName;
    Slime s = new Slime();
    monsterName = s.Name;
  }
}

除此之外,我建议你使用var

  Slime s = new Slime();

会变成

  var slime = new Slime();

此外,无需直接声明支持字段。使用这个:

public string Name { get; set; } = "Slime";

祝 C# 好运。

【讨论】:

  • 成功了!非常感谢帮忙。我从这个练习中学到了很多东西,但现在我已经准备好进入程序的下一部分了。
猜你喜欢
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 2011-11-16
  • 2013-01-04
  • 2022-01-23
相关资源
最近更新 更多