比较两个类型为T的System.Enum
我现在非常接近了解Generics(我认为)。
但是,只是认为System.Enum不容易实现为generics类型。 我有这堂课:
public class Button where TEnum : struct, IConvertible, IComparable, IFormattable { public TEnum Identifier { get; private set; //Set in the ctor } }
和
public abstract class AbstractInputDevice where TEnum : struct, IConvertible, IComparable, IFormattable { private List<Button> _buttons = new List<Button>(); public Button GetButton(TEnum Identifier){ foreach(Button button in _buttons){ if(button.Identifier == Identifier) //<- compiler throws return button; } Debug.Log("'" + GetType().Name + "' cannot return an unregistered '" + typeof(Button).Name + "' that listens to '" + typeof(TEnum).Name + "." + Identifier.ToString() + "'."); return null; } }
InputDevice可能看起来像这样:
public class Keyboard : AbstractInputDevice { private void Useless(){ Button = GetButton(KeyCode.A); } }
编译器在这里抛出一个编译错误:
if(button.Identifier == Identifier) //In AbstractInputDevice above
我相信我无法比较这两个TEnums,因为它们实际上并不是Enums。
因此没有比较方法可用。
我用过这个资源:
创建将T限制为枚举的通用方法
我感谢任何更好的解决方案或修复。
(但我想将Enum条目作为GetButton(EnumEntry)
的参数GetButton(EnumEntry)
)
而不是不可能的
button.Identifier == Identifier
你应该使用
EqualityComparer.Default.Equals(button.Identifier, Identifier)
这避免了将值装入object
框(或IComparable
框)。
您正尝试对值类型(struct)执行引用比较,而使用Equals
代替相等:
public Button GetButton(TEnum Identifier) { var button = _buttons .Where(b => EqualityComparer .Default.Equals(b.Identifier, Identifier)) .FirstOrDefault(); if (button == null) Debug.Log("'" + GetType().Name + "' cannot return an unregistered '" + typeof(Button ).Name + "' that listens to '" + typeof(TEnum).Name + "." + Identifier.ToString() + "'."); return button; }
无法执行button.Identifier == Identifier
语句,因为结构不存在==
运算符。 在课堂上它会进行参考比较。
正如@JeppeStigNielsen在他的回答中指出的那样,为了防止拳击等式比较,最好使用EqualityComparer
方法。