比较两个类型为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.Default.Equals方法。