将枚举转换为 return 通用 C# 7.3

Cast Enum to return Generic C# 7.3

这很可能是一个概念上的误解,但我想知道为什么。

我有一个静态方法可以 return 一个通用值 T,它还接收一个字符串。

public static T GetWordType<T>(string word) where T : System.Enum
{
    if (typeof(T) == typeof(ActionType))
    {
        foreach (Word<ActionType> action in actionsList)
        {
            if (action.synonims.Contains(word))
                return action.type;
        }
        return ActionType.None;
    }
    return WordType.None;
}

All returns 给我一个标题为 "You cannot convert implicitly Action.ActionType to T" 的转换错误。

为什么?

我的操作 class 声明为继承自抽象词 Class,定义如下:

public abstract class Word<T> where T : System.Enum
{
    public List<string> synonims;
    public T type;
}

我显然把它搞得一团糟而且过于复杂了,但我不知道应该如何实施。感谢您的帮助。

编辑:作为 Pavel Anikhouski 的请愿书 我的 ActionType 枚举在 Action class 中声明如下:

class Action : Word<ActionType>
{
    public enum ActionType
    {
        Open, Close, Shutdown, Stop, Send, Save, Load, Move, Add, Cancel, None
    }
}

我的 WordType 枚举是一个测试枚举,此时可以是任何枚举,只是将其设置为测试不同枚举的 returning。类似于:

public enum WordType
{
    None, Test
}

我把你的东西拿出来的时候看看这个if:

public static T GetWordType<T>(string word) where T : System.Enum
{
    if (typeof(T) == typeof(ActionType))
    { … }

    return ActionType.Cancel;
}

如您所见,您检查 T 是否为 ActionType。如果它是 而不是 ,那么你 return ActionType.Cancel 这显然是一个 ActionType。但是您的方法应该 return T 而您刚刚证明 而不是 ActionType.

因此,您实际上希望您的方法在所有情况下都 return ActionType 而不是 T,因为这正是您正在做的:

public static ActionType GetWordType<T>(string word) where T : System.Enum
{
    if (typeof(T) == typeof(ActionType))
    {
        foreach (Word<ActionType> action in actionsList)
        {
            if (action.synonims.Contains(word))
                return action.type;
        }
        return ActionType.None;
    }
    return ActionType.Cancel;
}

在这一点上,有人可能会争辩说您在这里甚至不需要泛型方法,因为除了检查其确切类型外,您并没有真正对参数化类型做太多事情 T

在泛型方法中处理 T 实际可能的类型通常不是一个好主意。它使您的方法变得脆弱,因为您正在寻找确切的类型,但实际上处理的类型 T 是无限的 所有 兼容类型无法计划。


你已经改变了你的问题,所以它 returns ActionType.Noneif 之内, WordType.None 在条件之外。您仍在 returning 具体类型,因此您无法使用您的方法 return T。而且这也行不通,因为 ActionTypeWordType 是不同的类型,并且枚举不允许继承,这可能会使其他 return 类型起作用。

如果您无法在编译时知道return类型,那么您将不得不returnobject并在运行时间,看看它到底是什么值。


如果您实际上意味着 return 值 WordType.None 是枚举类型 T 的值,那么您 可以 做什么始终是 return 枚举的默认值。这样,您就可以通过 ActionType:

的自定义处理使您的方法通用
public static T GetWordType<T>(string word) where T : System.Enum
{
    if (typeof(T) == typeof(ActionType))
    {
        // you know `T` is `ActionType`, so you can cast to `T`:
        return (T)(object)ActionType.None;
    }

    // since you don’t know `T`, you cannot refer to actual values on
    // the imaginary enum `T`; you can however use the default value
    // (which will be the value 0, by default the first enum value)
    return default(T);
}