【问题标题】:C# Enums and possibly having a default value?C# 枚举和可能有一个默认值?
【发布时间】:2017-03-10 11:42:52
【问题描述】:

所以我有以下枚举,我需要它有一个由其他代码使用的“无”项,如方法:GetCompassDirectionFromUnitVector,如下所示:

    public enum CompassDirection
{
    North = 90,
    Northeast = 45,
    East = 0,
    Southeast = -45,
    South = -90,
    Southwest = -135,
    West = 180,
    Northwest = 135,
    None = null
}


/// <summary>
/// Returns compass direction (North, Southwest, etc.) from a given direction unit vector. 
/// Returns CompassDirection.None if given Vector is not a unit vector.
/// </summary>
/// <param name="vec">Direction unit vector</param>
/// <returns></returns>
public static CompassDirection GetCompassDirectionFromUnitVector(Vector vec)
{
    Dictionary<Vector, CompassDirection> list = new Dictionary<Vector, CompassDirection>()
    {
        {new Vector(0, 0), CompassDirection.None},
        {new Vector(0, 1), CompassDirection.North},
        {new Vector(0, -1), CompassDirection.South},
        {new Vector(1, 0), CompassDirection.East},
        {new Vector(-1, 0), CompassDirection.West},
        {new Vector(1, 1), CompassDirection.Northeast},
        {new Vector(1, -1), CompassDirection.Southeast},
        {new Vector(-1, 1), CompassDirection.Northwest},
        {new Vector(-1, -1), CompassDirection.Southwest},
    };
    if (list.ContainsKey(vec))
    {
        return list[vec];
    }
    return CompassDirection.None;
}

但是我写的是下面的方法:

   Angle GetAngleFromCompassDirection(CompassDirection dir)

因此,在枚举值中包含角度在这里非常有用。 但是整数不能为空,因此具有“无”值枚举是无效的。

我该如何解决这个问题?

【问题讨论】:

  • 不要发截图,直接把代码粘贴到问题里。
  • 您可以使用枚举的可空版本CompassDirection?
  • 复制和粘贴代码比发布快照更容易 - 试试吧
  • "0" 是枚举的默认值,如 here 所述。如果 0 是实际值,则无法区分默认值和实际 0 值。
  • @user3524922 no - "枚举 [值] 的批准类型为 byte、sbyte、short、ushort、int、uint、long 或 ulong。"跨度>

标签: c# enums


【解决方案1】:

枚举值的默认值始终为零 (0)。我建议您将实现更改为:

public static CompassDirection? GetCompassDirectionFromUnitVector(Vector vec)
{
    Dictionary<Vector, CompassDirection> list = new Dictionary<Vector, CompassDirection>()
    {
        {new Vector(0, 0), CompassDirection.None},
        {new Vector(0, 1), CompassDirection.North},
        {new Vector(0, -1), CompassDirection.South},
        {new Vector(1, 0), CompassDirection.East},
        {new Vector(-1, 0), CompassDirection.West},
        {new Vector(1, 1), CompassDirection.Northeast},
        {new Vector(1, -1), CompassDirection.Southeast},
        {new Vector(-1, 1), CompassDirection.Northwest},
        {new Vector(-1, -1), CompassDirection.Southwest},
    };
    if (list.ContainsKey(vec))
    {
        return list[vec];
    }
    return null;
}

(注意 Nullable 返回类型)然后您可以像对待 CompassDirection.None 一样对待空值。

【讨论】:

  • 如果我可以返回 null,那么“无”值就变得毫无意义了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2011-10-27
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多