Jestem całkiem bliski zrozumienia Generics teraz (myślę).
Jednak uznałem, że System.Enum nie jest łatwy do wdrożenia jako typ ogólny. mam tej klasy:Porównaj dwa System.Enum typu T
public class Button<TEnum> where TEnum : struct, IConvertible, IComparable, IFormattable {
public TEnum Identifier {
get;
private set; //Set in the ctor
}
}
i
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 może wyglądać tak:
public class Keyboard : AbstractInputDevice<KeyCode> {
private void Useless(){
Button<KeyCode> = GetButton(KeyCode.A);
}
}
Kompilator generuje błąd kompilacji prawo tutaj:
if(button.Identifier == Identifier) //In AbstractInputDevice above
Uważam, że nie mogę porównać tych dwóch TEnums, ponieważ w rzeczywistości nie są one znane jako Enums.
I dlatego żadna metoda porównania nie jest dostępna.
użyłem tego zasobu:
Create Generic method constraining T to an Enum
Doceniam żadnego lepszego rozwiązania lub poprawki.
(Ale chcę zachować pozycję Enum jako parametr GetButton(EnumEntry)
)
Jaki jest dokładny błąd dostarczany przez kompilator? –
Możesz chcieć wypróbować 'button.Identifier.Equals (Identifier)', a żeby było bardziej zwięzłe: 'var button = _buttons.Where (b => b.Identifier.Equals (Identifier)). FirstOrDefault();' . – Alex
@RonBeyer Używam Unity3D, a ich kompilator jest czasem trochę zagmatwany. W tej chwili mówi "nieoczekiwany symbol" == "" jak gdyby wystąpił błąd literowy. Ale przed niektórymi zmianami było napisane, że coś innego, jak "" == ", nie może być zastosowane do operandów typu" TEnum "i" TEnum "." –