【问题标题】:Why if I use if else it works and if I use ternary operator it doesn't?为什么如果我使用 if else 它可以工作,而如果我使用三元运算符却不行?
【发布时间】:2016-04-11 23:50:20
【问题描述】:

我是 C# 新手,我来自 C++。

为什么如果我使用“if else”它可以工作,但如果我使用三元运算符就不行?

我以为是因为第三部分中的“Console.Writeline()”,我用一个普通的作业替换了,但还是有同样的问题。

提前谢谢你!

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)
        {

        }
    }
}

【问题讨论】:

  • “没有”是什么意思?它会做你意想不到的事情吗?如果有,是什么?
  • 你必须说“不起作用”是什么意思。您收到错误消息吗?如果是,什么信息?行为是否与您的预期不同?如果是,预期和实际行为是什么?
  • 嗯,你是对的。它甚至不编译。我在意大利语中使用 Visual Studio。它说不可能推断出那种条件表达式,因为它不存在“char”到“void”的隐式转换。
  • 您是如何尝试编写三元运算符的?如果您尝试过board[x-1,y-1] = (x &gt; 1 &amp;&amp; x &lt; 4 &amp;&amp; y &gt; 1 &amp;&amp; y &lt; 4) ? sign : 'n',它应该可以工作。如果您刚刚尝试过(x &gt; 1 &amp;&amp; x &lt; 4 &amp;&amp; y &gt; 1 &amp;&amp; y &lt; 4) ? sign : 'n',那么您就有问题了,它不应该这样写。

标签: c# ternary-operator


【解决方案1】:

编译时会报错,因为三元运算符必须返回一个值。它不是 if/else 块的直接替代品。

代码做了两件截然不同的事情:一件设置数组的值,另一件打印错误。

【讨论】:

    【解决方案2】:

    尝试使用类似的东西

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

    三元执行会返回一个值

    但是,您应该以不同的方式处理此问题,并且即使位置超出范围,也要在此之前失败 - 您真的不需要三元组。

    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;
    

    【讨论】:

    • 太棒了!请参阅我的编辑,我认为这是一个更优雅的解决方案。干杯,编码愉快!
    【解决方案3】:

    三元运算符的结果是所选表达式的结果,这意味着两个表达式需要具有相同的类型。

    例如,如果您要使用the comma operator 来确保第二个表达式与第一个表达式具有相同的类型,我想您会发现它可以编译并运行得很好...

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

    请注意,这对我来说似乎是一个残酷的选择。当我们想要存储选择的结果时,我们倾向于使用三元运算符。 if/else 变体似乎是这里的最佳选择...

    【讨论】:

    • 谢谢你,但是写 (x > 1 && x 1 && y
    • 抱歉,Seb,但这仍然行不通,因为它会引发编译错误 - 转折必须返回一个值,因为 (x &gt; 1 &amp;&amp; x &lt; 4 &amp;&amp; y &gt; 1 &amp;&amp; y &lt; 4) 不是有效调用。
    • @MattClark 您是否单击了此答案中有关逗号运算符的链接并阅读了?
    • @MattClark 三元不 return 任何东西,单独的括号不一定表示函数调用。不幸的是,您对语言的理解不足。
    • @PaoloVeneziani 你错过了一个')'...尝试复制/粘贴我的示例,这样你就做对了。
    猜你喜欢
    • 2013-10-09
    • 2021-01-14
    • 2021-07-03
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多