【发布时间】:2015-04-28 20:40:24
【问题描述】:
我现在已经非常接近了解泛型了(我认为)。
但是,只是认为 System.Enum 不容易实现为泛型类型。
我有这门课:
public class Button<TEnum> where TEnum : struct, IConvertible, IComparable, IFormattable {
public TEnum Identifier {
get;
private set; //Set in the ctor
}
}
和
public abstract class AbstractInputDevice<TEnum> where TEnum : struct, IConvertible, IComparable, IFormattable {
private List<Button<TEnum>> _buttons = new List<Button<TEnum>>();
public Button<TEnum> GetButton(TEnum Identifier){
foreach(Button<TEnum> button in _buttons){
if(button.Identifier == Identifier) //<- compiler throws
return button;
}
Debug.Log("'" + GetType().Name + "' cannot return an <b>unregistered</b> '" + typeof(Button<TEnum>).Name + "' that listens to '" + typeof(TEnum).Name + "." + Identifier.ToString() + "'.");
return null;
}
}
InputDevice 可能如下所示:
public class Keyboard : AbstractInputDevice<KeyCode> {
private void Useless(){
Button<KeyCode> = GetButton(KeyCode.A);
}
}
编译器在这里抛出编译错误:
if(button.Identifier == Identifier) //In AbstractInputDevice above
我相信我无法比较这两个 TEnum,因为它们实际上并不知道是 Enum。
因此没有可用的比较方法。
我使用了这个资源:
Create Generic method constraining T to an Enum
感谢任何更好的解决方案或修复。
(但我想保留 Enum 条目作为 GetButton(EnumEntry) 的参数)
【问题讨论】:
-
编译器给出的确切错误是什么?
-
你可以试试
button.Identifier.Equals(Identifier),让事情更简洁:var button = _buttons.Where(b => b.Identifier.Equals(Identifier)).FirstOrDefault();。 -
@RonBeyer 我使用 Unity3D,他们的编译器有时有点混乱。现在它说“意外符号'=='”,好像会有错字。但在进行一些更改之前,它表示“'==' 不能应用于 'TEnum 和 'TEnum' 类型的操作数”之类的不同内容
-
我想说你需要创建一个MCVE
-
@Alex 你是认真的吗?没有错误了!
标签: c# generics enums comparison