【问题标题】:Can't use static objects in a Switch statement in Unity不能在 Unity 的 Switch 语句中使用静态对象
【发布时间】:2023-01-08 23:22:28
【问题描述】:

我有 Unity 2021,所以我相信它使用 C# 版本 > 7。 不知何故我不能在 Switch/Case 语句中使用静态对象。

  private Position getStartingPosition(Direction direction) {
    switch (direction) {
      case Direction Direction.EAST:
        return new Position(-1, height / 2);
      case Direction Direction.NORTH:
        return new Position(width / 2, height);
      case Direction Direction.WEST:
        return new Position(width, height / 2);
      case Direction Direction.SOUTH:
        return new Position(width / 2, -1);
      default:
        throw new System.Exception("Impossible");
    }
  }

和方向类:

public class Direction
{
    static public readonly Direction EAST = new Direction(1, 0);
    static public readonly Direction NORTH = new Direction(0, -1);
    static public readonly Direction WEST = new Direction(-1, 0);
    static public readonly Direction SOUTH = new Direction(0, 1);

...

我得到的错误是:

Grid.cs(38,31): error CS1003: Syntax error, ':' expected
Grid.cs(38,31): error CS1513: } expected
Grid.cs(38,36): error CS1003: Syntax error, ':' expected
Grid.cs(38,36): error CS1513: } expected
Grid.cs(40,31): error CS1003: Syntax error, ':' expected
Grid.cs(40,31): error CS1513: } expected

我究竟做错了什么?

【问题讨论】:

    标签: c# unity3d object static switch-statement


    【解决方案1】:

    case声明应该是没有声明的MyClass.VALUE:。但Direction 也是一个对象,因此您必须修改为:

    switch (direction) {
        case var _ when direction == Direction.EAST:
            return new Position(-1, height / 2);
        case var _ when direction == Direction.NORTH:
            return new Position(width / 2, height);
        case var _ when direction == Direction.WEST:
            return new Position(width, height / 2);
        case var _ when direction == Direction.SOUTH:
            return new Position(width / 2, -1);
        default:
            throw new System.Exception("Impossible");
    }
    

    请注意它不是Direction Direction.EAST,而只是Direction.EAST

    【讨论】:

    • 这仍然行不通,因为 switchafaik 需要编译时间常量这不是这里的情况
    • 然后它给出了这个错误“Grid.cs(38,18): error CS0150: A constant value is expected”
    • 更好的;但是,不可能将对象用作案例标签。
    • 是的,我没有意识到 Direction 是一个对象。我认为这现在应该可行。
    【解决方案2】:

    已经在这里回答: Switch statement with static fields

    我把它改成

        switch (direction) {
          case var _ when direction == Direction.EAST:
            return new Position(-1, height / 2);
          case var _ when direction == Direction.NORTH:
            return new Position(width / 2, height);
          case var _ when direction == Direction.WEST:
            return new Position(width, height / 2);
          case var _ when direction == Direction.SOUTH:
            return new Position(width / 2, -1);
          default:
            throw new System.Exception("Impossible");
        }
    
    

    【讨论】:

      【解决方案3】:

      在下面的实现中有两个错误。

      首先Direction在案例条件下被重复;你不想要Direction Direction.EAST,只想要Direction.EAST

      第二件事,只有当对象实现了 IComparable 接口时,你才能将对象用作 case 标签

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 2012-09-07
        • 2014-12-25
        • 2013-12-31
        • 2015-12-18
        相关资源
        最近更新 更多