将枚举转换为 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.None
在 if
之内, WordType.None
在条件之外。您仍在 returning 具体类型,因此您无法使用您的方法 return T
。而且这也行不通,因为 ActionType
和 WordType
是不同的类型,并且枚举不允许继承,这可能会使其他 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);
}
这很可能是一个概念上的误解,但我想知道为什么。
我有一个静态方法可以 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.None
在 if
之内, WordType.None
在条件之外。您仍在 returning 具体类型,因此您无法使用您的方法 return T
。而且这也行不通,因为 ActionType
和 WordType
是不同的类型,并且枚举不允许继承,这可能会使其他 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);
}