【问题标题】:Possible to use && or || in switch statement? Visual C#可以使用 && 或 ||在 switch 语句中?视觉 C#
【发布时间】:2013-11-02 01:23:08
【问题描述】:

所以我正在制作一个石头剪刀布游戏,我对它进行了一些调整,以包括生活和其他事物。现在我被switch语句卡住了。我的 if 语句工作正常:

private void Result_TextChanged(object sender, EventArgs e)
{
     if (playerscore == 1 || pcscore == 1)
     {
          PlayerLife.Image = Properties.Resources.Five;
     }
}

我想知道如何将其转换为 switch 语句?

private void Result_TextChanged(object sender, EventArgs e)
{              
    switch (playerscore || pcscore)
    {
         case 1:
             PlayerLife.Image = Properties.Resources.Five;
             break;
    }
}

好像没用。

【问题讨论】:

  • 你必须在单个变量的值上switch,为什么要使用switch?
  • 不,这在 C# 中是不可能的。 VB.NET 可能允许这样的事情,因为它的 Select statement 比 C# 的 switch 灵活得多。
  • 请问为什么if 语句在这种情况下不合适?
  • case 是一种根据给定开关条件的 VALUE 选择要运行的代码括号的方法。通常这将是一个变量。在您的情况下,使用 AND / OR 将始终只导致两个可能值之一,真或假。所以这里不适合大小写。
  • 如果您来自 JavaScript,其中 || 用于选择非虚假值,而不是 C# 等效的 JavaScript || 大约是 playerscore != 0? playerscore:pcscore,或者有时 ?? 用于引用类型(@987654322 @)

标签: c# if-statement switch-statement


【解决方案1】:

简单的答案是否定的。你不能那样使用它。

Switch 适用于单个表达式

您可以查看MSDN了解详情。

你可以这样尝试:-

  if (playerscore == pcscore)
        {
            switch (playerscore)
            {
                case 1:
                PlayerLife.Image = Properties.Resources.Five;
                break;
            }
        }

编辑:-

正如 Jeppe Stig Nielsen 在 cmets 中评论的那样,You can switch on any expression of a suitable type. That expression may contain ||. There can be many case labels associated with each switch section in a switch block.

但就个人而言,这不是一个好的做法。您可以尝试为此使用 if 语句。

如果你愿意,你可以这样尝试:

 switch (playerscore == 1 || pcscore == 1)

【讨论】:

  • 哦,好吧。所以如果我想让它成为一个 switch 语句,我必须将 playercore 和 pcscore 分开?
  • @user2911044:- 我认为如果你可以使用 if 语句会更好。建议不要违反 C# 的规则。
  • 投反对票。您可以在任何合适类型的表达式上 switch。该表达式可能包含||。可以有许多case 标签与 switch 块中的每个 switch 部分相关联。
  • @JeppeStigNielsen:- 是的,我同意先生,但我认为这不是一个很好的做法!如果我错了,请纠正我:)
  • +1。我认为“单变量值”令人困惑,而“单值”更好(如playerscore | pcscore 可以,但有 2 个变量)
【解决方案2】:

在 C# 中,switch 语句解析单个表达式并将该值与可能的案例列表进行比较:

switch(someExpression)
{
   case x: // This runs if someExpression == x
      break;
   case y: // This runs if someExpression == y
      break;
}

现在,您可以(playerscore == 1 || pcscore == 1) 表达式上使用switch,如下所示:

switch(playerscore == 1 || pcscore == 1) // This expression is either true or false
{
   case true: // Runs if playerscore is 1 or pcscore is 1
      break;
   case false: // runs if neither playscore or pcscore are 1
      break;
}

但是,上面的内容相当不可读和愚蠢。最好使用if 声明:

if(playerscore == 1 || pcscore == 1)
{
   // Runs if playerscore is 1 or pcscore is 1
}
else
{
   // runs if neither playscore or pcscore are 1
}

【讨论】:

  • 我认为他的意思是“如果 ((playerscore == 1) || (pcscore == 1))”
  • playerscore || pcscore 在 C# 中根本无法解析:它们都是数字,并且与其他语言不同,并非所有事物都有真实性。
  • @TimS。 - 是的,我根本没有仔细阅读这个问题!
【解决方案3】:

您尝试做的事情没有意义,如果 playercore = 3 和 pcscore = 2 那么 playercore || pcscore 是否等于?

【讨论】:

  • 是的,我刚刚意识到我的错误。哈哈,看来我毕竟可以使用 switch 语句了 :)
  • 这更像是一个评论而不是一个答案,不是吗?
  • @Harrison 说没有答案答案。
  • 我推测 @user2911044 希望 both case 3case 2 在这种情况下运行?但按什么顺序?如果值相等,相关的开关部分是否应该运行两次?无论如何,switch 不是那样工作的。
【解决方案4】:

你可以这样写,但你为什么要这样?

  switch (playerscore == 1 || pcscore == 1)
        {
            case true:
                PlayerLife.Image = Properties.Resources.Five;
                break;
            default:
                break;
        }

正如 Jeppe 在下面的评论中指出的那样,当您使用 || 时或者 && 你最终得到一个 bool 并且应该使用一个 if 语句。

这是@EricLippert 撰写的精彩answer,关于在 swtich 语句中可以用作 表达式 的内容。

【讨论】:

  • 虽然这行得通,但为什么switch 会出现在bool 类型的表达式上?使用ififelse 会更清晰!
  • @JeppeStigNielsen 我完全同意,这就是为什么我在答案中评论了你为什么想要
【解决方案5】:

这是没有意义的:在 switch 语句中,您总是希望与特定类型进行比较,而不是与布尔值进行比较,如下所示:

switch (playerscore || pcscore)

在你的情况下使用'if'语句

【讨论】:

    【解决方案6】:

    如果你有一大堆变量,不仅仅是两个,而是 5、10,甚至是一个未知数,那么你可以做的就是将所有你想与 1 比较的值放入一个集合,然后将该集合作为一个整体进行操作。

    //this could just be a list/array accepted as a paramter, 
    //can include other variables, or whatever
    var scores = new []{playerscore, pcscore};
    
    if(scores.Any(score => score == 1))
        PlayerLife.Image = Properties.Resources.Five;
    

    switch 并不是真正适合处理此类集合的工具。

    【讨论】:

    • 我认为你的意思不是data,而是scores
    • @MikeChristensen 谢谢,已修复。
    【解决方案7】:

    假设playerscore和pcscore是整数,可能取值为0或1

        resp = playerscore + 10 * pcscore;
        switch (resp)
        {
            case 0:
                // both are false
                break;
            case 1:
                // playerscore true
                break;
            case 10:
                // pcscore true
                break;
            case 11:
                // both are true
                break;
            default:
                // error in input data
                break;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 2012-04-14
      • 2015-11-07
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多