2017-07-06 12 views
0

ここでC#の新機能をコーディングする熱心な人は、この問題の壁を克服しています。何日か。このサイトで検索を試みただけでなく、このエラーのドキュメントをmsdnで読んだり、クラス、フィールド、初期化などのドキュメントを読んでみました。これが他の人には明らかであれば謝罪しますが、このエラーを理解する。フィールド初期化子は、非静的フィールド、メソッド、またはプロパティを参照することはできません。変数を設定します。

私は最初のC#プログラムとして基本的なMUDゲーム(コマンドラインで実行されるテキストベースのRPG)を書いています。私はモンスターの統計情報にアクセスしようとすると問題に遭遇しています"Bestiary"という名前の別の名前空間で、すべてのモンスターの統計情報を独自のClassとして含む)。私はいくつかの異なる方法を試しましたが、プログラムをエラーなくコンパイルすることができませんでした。

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();"という行にエラーが表示されます。

+1

Edit_SOrry:.Nameはプロパティであり、メソッドではありません。 'string monsterName = s.Name;' - ()を削除します。 – ainwood

+0

あなたのコメントは何らかの理由で消滅しました。私はコンストラクタの例で私の答えを更新しました。 –

+0

申し訳ありませんが、私は更新前に私のコメントを書いて、その後、それを削除して、それゆえに消えた。私は現在、それがコンパイルされるかどうかを確認するために変更を実装しています。リードしてくれてありがとう、私は一度チェックインし終わった! – Sandrockcstm

答えて

2

あなたはこのようなあなたのスライムの名前を参照する必要があります

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#で。

+0

それは働いた!助けてくれてありがとう。私はこのエクササイズからかなり学んだが、今度はプログラムの次の部分に進む準備ができている。 – Sandrockcstm

関連する問題