C# 枚举并可能具有默认值?
C# Enums and possibly having a default value?
所以我有以下枚举,我需要它有一个供其他代码使用的 "None" 项,例如方法: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)
因此,在枚举值中包含角度在这里非常有用。
但整数不可为空,因此 "None" 值枚举无效。
我该如何解决这个问题?
枚举值的默认值始终为零 (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 return 类型)然后您可以像对待 CompassDirection.None.
一样对待空值
所以我有以下枚举,我需要它有一个供其他代码使用的 "None" 项,例如方法: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)
因此,在枚举值中包含角度在这里非常有用。 但整数不可为空,因此 "None" 值枚举无效。
我该如何解决这个问题?
枚举值的默认值始终为零 (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 return 类型)然后您可以像对待 CompassDirection.None.
一样对待空值