c# – 比较两个类型为T的System.Enum

前端之家收集整理的这篇文章主要介绍了c# – 比较两个类型为T的System.Enum前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我现在非常接近了解Generics(我认为). @H_403_2@但是,只是认为System.Enum不容易实现为泛型类型. @H_403_2@我有这门课:
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,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

我相信我无法比较这两个TEnums,因为它们实际上并不是Enums.@H_403_2@因此没有比较方法可用.

我用过这个资源:@H_403_2@Create Generic method constraining T to an Enum

我感谢任何更好的解决方案或修复.@H_403_2@(但我想将Enum条目作为GetButton(EnumEntry)的参数保留)

解决方法

而不是不可能的
button.Identifier == Identifier

你应该使用

EqualityComparer<TEnum>.Default.Equals(button.Identifier,Identifier)

这样可以避免将值装入对象框(或IComparable框).

原文链接:https://www.f2er.com/csharp/97047.html

猜你在找的C#相关文章