2016-04-11 16 views
0

Ich bin neu in C# und ich komme aus C++.Warum, wenn ich benutze, wenn es sonst funktioniert und wenn ich Ternäroperator verwende, tut es nicht?

Warum, wenn ich "if else" es funktioniert, aber wenn ich Ternäroperator verwenden, tut es nicht?

Ich dachte, dass es wegen "Console.Writeline()" im dritten Teil war, und ich ersetzte mit einer gemeinsamen Aufgabe, aber es gibt das gleiche Problem.

Vielen Dank im Voraus!

using System; 
using System.Collections.Generic; 
using System.Linq; 

using System.Text; 

using System.Threading.Tasks; 

namespace ConsoleApplication8 
{ 
    class Board 
    { 
     private char[,] board = new char[3, 3]; 
     public void move (int g, int x, int y) //player, x , y position 
     { 
      char sign = ' '; 

      switch (g) 
      { 
       case '1': 
        sign = '0'; 
        break; 
       case '2': 
        sign = 'x'; 
        break; 
       default: 
        Console.WriteLine("Input Error"); 
        break; 
      } 

      //error (x > 1 && x < 4 && y > 1 && y < 4) ? (board[x - 1, y - 1] = sign) : (Console.WriteLine("Error")); 

      if (x > 1 && x < 4 && y > 1 && y < 4) 
      { 
       board[x - 1, y - 1] = sign; 
      } 
      else Console.WriteLine("Error"); 

     } 
    } 

    class Game 
    { 
     static void Main(string[] args) 
     { 

     } 
    } 
} 
+3

Was meinst du mit "es nicht"? Tut es etwas, was Sie nicht erwarten? Wenn ja, was? –

+0

Sie müssen sagen, was "nicht funktioniert" bedeutet. Erhalten Sie eine Fehlermeldung? Wenn ja, welche Nachricht? Ist das Verhalten anders als erwartet? Wenn ja, was ist das erwartete und tatsächliche Verhalten? – NineBerry

+0

Umh du hast Recht. Es kompiliert nicht einmal. Ich benutze Visual Studio auf Italienisch. Es besagt, dass es nicht möglich ist, die Art von Bedingungsausdruck abzuleiten, da es kein "Char" gibt, um die implizite Konvertierung "ungültig" zu machen. –

Antwort

4

Es gibt Ihnen einen Fehler, wenn da die tenary Betreiber Kompilieren muss Rückkehr ein Wert. Es ist kein Drop-In-Ersatz für einen if/else-Block.

Der Code unterscheidet zwei sehr unterschiedliche Dinge: Einer setzt den Wert eines Arrays, der andere gibt einen Fehler aus.

+0

Vielen Dank –

2

versuchen so etwas wie diese

board[x-1, y-1] = (x > 1 && x < 4 && y > 1 && y < 4) ? sign : '-'; 

Die ternäre Ausführung Wert kehrt

jedoch verwenden, sollten Sie dies anders nähern, und scheitern, bevor dies auch geschieht, wenn die Position außerhalb der Grenzen ist - Sie brauchen hier wirklich kein Ternär.

private int width = 3; 
private int height = 3; 

... 

if (x > width || y > height || x < 0 || y < 0) 
{ 
    // fail because position is out of the bounds of the board 
} 

board[x, y] = sign; 
+0

Vielen Dank! So hat es funktioniert! –

+0

Super! Sehen Sie meine Bearbeitung für, was ich denke, ist eine elegante Lösung. Prost und fröhliche Codierung! –

0

Das Ergebnis des ternären Operator ist das Ergebnis des ausgewählten Ausdrucks, und das bedeutet, beide Ausdrücke den gleichen Typ haben müssen.

Wenn Sie the comma operator zu verwenden waren, zum Beispiel, der zweite Ausdruck, um sicherzustellen, den gleichen Typ wie der erste hat, ich glaube, Sie würden finden diese kompiliert und läuft ganz gut ...

(x > 1 && x < 4 && y > 1 && y < 4) ? (board[x - 1, y - 1] = sign) 
            : (Console.WriteLine("Error"), sign); 

Geist du, es scheint mir eine grausame Entscheidung zu sein. Wir neigen dazu, den ternären Operator zu verwenden, wenn wir das Ergebnis der Wahl speichern wollen. Die if/else Variante scheint die beste Wahl hier zu sein ...

+0

Vielen Dank, aber schreiben (x> 1 && x < 4 && y > 1 && y <4)? (board [x - 1, y - 1] = zeichen: (Console.WriteLine ("Error"), sign); funktioniert nicht :( –

+0

Sorry Seb, aber das würde immer noch nicht funktionieren, da es eine Kompilation wirft error - ein turnary ** muss ** einen Wert zurückgeben, da einfach '(x> 1 && x < 4 && y > 1 && y <4)' kein gültiger Aufruf ist. –

+0

@MattClark Haben Sie aus dieser Antwort auf den Link zum Komma-Operator geklickt und gelesen? – Sebivor

Verwandte Themen