c#枚举,可能有默认值

本文关键字:默认值 可能有 枚举 | 更新日期: 2023-09-27 18:15:14

所以我有以下enum,我需要它有一个"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"值枚举是无效的。

我怎么绕过这个?

c#枚举,可能有默认值

Enum值的默认值将始终为0(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那样对待空值