2016-03-23 41 views
5

questa può essere una domanda semplice per le persone, ma non riesco a capire perché questo si sta verificando. Ecco il mio codice prima:Token non valido '=' in classe, struct o dichiarazione membro dell'interfaccia C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace GameCore 
{ 
    public class PlayerCharacter 
    { 

     public void Hit(int damage) 
     { 
      Health -= damage; 

      if (Health <= 0) 
      { 
       IsDead = true; 
      } 
     } 

     public int Health { get; private set; } = 100; 
     public bool IsDead{ get; private set; } 

    } 
} 

ora lo studio visivo sta dando l'errore di token non valido sul segno di assegnazione (=) (come da titolo), e non riesco a capire perché. qualcuno può far luce su questo per favore?

Quello che sto cercando di fare è impostare l'int di Salute su 100, e ogni volta che un personaggio subisce danni, la Salute diminuisce. Ringrazia tutti.

sto usando Visual Studio 2013 aggiornamento v12.0.40629.00 5

+0

@SimonKarlsson In realtà, un controllo di morte sarebbe probabilmente eseguito dopo ogni colpo comunque. Personalmente farei semplicemente restituire Hit come booleano immediatamente per evitare un'altra chiamata. Ad ogni modo, ottimizzare il suo gioco non è la domanda qui. – Nyerguds

+0

grazie ragazzi, lo prenderò in considerazione, questa è una classe semplice per la sperimentazione con specFlow ... Cambierò il bool pubblico in un secondo momento .. volevo solo far funzionare le cose. grazie ancora, G. –

+0

@Nyerguds. Si ha ragione, non dovremmo, tuttavia, il mio punto è piuttosto quello di garantire la correttezza, quindi l'ottimizzazione. Immagina lo scenario in cui aggiunge un metodo di revive, quindi dovrebbe anche cambiare il valore del 'bool'' IsDead'. Il mio punto era che "IsDead" è più un controllo che un valore reale. :) –

risposta

8

settting un predefinito valore per le proprietà auto-implementato è disponibile solo da C# -version 6 e verso l'alto. Prima Versione 6 si deve utilizzare il costruttore e impostare il valore predefinito valore c'è:

public class PlayerCharacter { 
    public int Health { get; private set; } 

    public PlayerCharacter() 
    { 
     this.Health = 100; 
    } 
} 

Per abilitare il compilatore per VS2013 è possibile utilizzare this approach.

+0

ringrazia HimBromBeere - ma dove lo metto nel codice che ho copiato nella domanda principale sopra? scusa un po 'di noob, sto imparando. vai facile, grazie.Graeme –

+0

Direttamente nella classe 'PlayerCharacter', preferibilmente nella sua parte superiore. – HimBromBeere

+0

ciao HimBromBeere - Penso che abbia fatto qualcosa di sbagliato ... ecco il nuovo codice, che non gli piace affatto, mi dispiace. namespace GameCore { classe pubblica PlayerCharacter { public int Health {get; set privato; } carattere giocatore pubblico { this.Health = 100; } pubblico vuoto Hit (danno int.) { Salute - = danno; if (Health <= 0) { IsDead = true; } } bool pubblico IsDead {get; set privato; } } } –

0

la risposta è stata:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace GameCore 
{ 
    public class PlayerCharacter 
    { 

     public int Health { get; private set; } 

     public PlayerCharacter() 
     { 
      this.Health = 100; 
     } 


     public void Hit(int damage) 
     { 
      Health -= damage; 


      if (Health <= 0) 
      { 
       IsDead = true; 
      } 
     } 




     public bool IsDead{ get; private set; } 

    } 
} 

fare il costruttore una funzione con() e non come PLayerCharacter {ecc

grazie a tutti, di nuovo nel mio buco vado.

0

Sembra che questo errore sia dovuto alla versione di MSBuild, la vecchia versione di MSBuild può compilare solo C# versione 4, mentre il codice scritto in C# versione 6 (imposta il valore predefinito per le proprietà).

Esempio di scrittura di codice in C# versione 6:

public static string HostName { get; set; } = ConfigurationManager.AppSettings["RabbitMQHostName"] ?? ""; 

Per MSBuild per compilare il codice, è necessario scrivere in C# 4 stile

public static string HostName { get; set; } 
public SomeConstructor() 
     { 
      HostName = ConfigurationManager.AppSettings["RabbitMQHostName"] ?? "";... } 

O

public static string HostName 
     { 
      get 
      { 
       return ConfigurationManager.AppSettings["RabbitMQHostName"] ?? ""; 
      } 
     } 

Spero che aiuti