【问题标题】:How do I return this variable using if statements?如何使用 if 语句返回此变量?
【发布时间】:2012-12-06 12:40:52
【问题描述】:

我知道这可能是一个愚蠢的问题,答案很简单,但是在互联网上搜索了一个小时后,我找不到这样做的方法;

    public bool GetCollision(int x, int y)
    {
        bool isPassable;

        if (x < 0 || x >= 20)
        {
            isPassable = false;
        }

        if (y < 0 || y >= 20)
        {
            isPassable = true;
        }

        return isPassable;
    }

在倒数第二行它说 isPassable 是未分配的......但显然我在 if 语句中分配给它。我对“if”语句肯定存在一些根本性的误解。

那么,我该怎么做呢?非常感谢。

【问题讨论】:

  • 如果例如 x = 5 和 y = 5,isPassable 的值是多少?
  • 另一个函数完全处理这个问题。我正在从 Microsoft 的 Platformer Starter Kit 中实现碰撞(至少尝试)。
  • 是的,但是 C# 编译器需要为每种可能的情况设置一个值。如果您确定这些情况永远不会发生,只需使用 true 或 false 初始化 isPassable,或者如果您不属于预期的情况,只需抛出异常...
  • Google 是您的朋友,对于“未分配变量 c#”,您将获得第一个带有 Q 和 A 的 SO 链接,完全相同!

标签: c# boolean


【解决方案1】:

那是因为它没有明确设置默认值。将 isPassable 默认设置为 False 即可。


你也可以这样做:

return (!(x < 0 || x >= 20) && (y < 0 || y >= 20))

编辑:仅当您的 IF 之间存在 AND 关系时,上述解决方案才有效。

【讨论】:

  • 你的返回值表达式错误。例如 x=-1 和 y=-1 返回 false 而 OP 方法将返回 true。
  • 你说得对,他的 IF 之间没有 AND 关系
【解决方案2】:

如果x == 10y == 10,这个函数的结果是什么?您还没有定义结果是什么,这就是编译器抱怨的原因。在此示例中,第一个 if 语句将评估为 false,并且不会发生任何事情。然后第二个if 语句将评估为false,并且该函数将尝试返回没有分配给isPassable 的值。

【讨论】:

    【解决方案3】:

    如果If 条件均未计算为 True,则该变量将无任何返回值。

    因此,为isPassable 分配一个默认值。

    【讨论】:

      【解决方案4】:

      问题是在某些情况下根本没有分配变量。例如,如果 x 和 y 都为 0,则例程将返回一个未分配的变量。这是一个禁忌。

      澄清一下,问题不在于没有初始分配(如isPassable = false;),而是编译器警告您可能忘记检查某些条件。

      类似的构造

      bool isPassable;
      if (...)
          isPassable = true;
      else
          isPassable = false;
      return isPassable;
      

      本来可以的!

      【讨论】:

        【解决方案5】:

        "isPassable is Unassigned" 编译器在抱怨,因为如果两个IF 条件都不满足怎么办。因此,您需要在声明它时为其分配一个值:-

         isPassable=false;
        

        【讨论】:

        • 应该是“如果都不满足if条件满足怎么办”
        • 没问题 - 通常我不会担心这些事情,但在这里它实际上影响了句子的含义。
        【解决方案6】:

        你也可以这样做:

        public bool GetCollision(int x, int y)
        {
            bool isPassable = false;
        
            if (y < 0 || y >= 20)
            {
                isPassable = true;
            }
        
            return isPassable;
        }
        

        这样,你可以确保它只有在满足这个条件时才返回true,否则只返回false

        【讨论】:

          【解决方案7】:

          你应该有一个默认值:

          bool isPassable = false;
          

          如果你不能准确说出是真是假,请改用nullable values,所以isPassable可以为null:

          public bool? GetCollision(int x, int y)
          {
              bool? isPassable = null;
          
              if (x < 0 || x >= 20)
              {
                  isPassable = false;
              }
          
              if (y < 0 || y >= 20)
              {
                  isPassable = true;
              }
          
              return isPassable;
          }
          

          【讨论】:

          • 你确定这样可以吗?我现在无法测试,但我相信这也需要分配isPassable,然后错误才会消失。唯一的区别是您可以根据需要指定null
          • 是的。既然你这么说,我也不确定。我会编辑答案。
          猜你喜欢
          • 1970-01-01
          • 2016-04-02
          • 2020-08-20
          • 2013-07-22
          • 2017-02-25
          • 1970-01-01
          • 2020-10-12
          • 1970-01-01
          • 2022-11-12
          相关资源
          最近更新 更多