Generische Klasse mit generischem Interface

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Rootbob91.

    Generische Klasse mit generischem Interface

    Guten Abend zusammen,

    kann mir jemand helfen/erklären was ich hier falsch mache?

    C#-Quellcode

    1. public abstract class NavigatableScreen<T> : Screen where T : EventArgs, ISteppable<T>
    2. {
    3. protected virtual void Continue() => OnContinue(EventArgs.Empty);
    4. protected void OnContinue(T e) => Continueing?.Invoke(this, e);
    5. public virtual bool CanContinue() => true;
    6. public event EventHandler Backing;
    7. public event EventHandler<T> Continueing;
    8. }
    9. public interface ISteppable<T> where T : EventArgs
    10. {
    11. void Continue();
    12. void OnContinue(EventArgs e);
    13. bool CanContinue();
    14. event EventHandler Backing;
    15. event EventHandler<T> Continueing;
    16. }


    Nun versuche ich eine Klasse davon erben zu lassen:

    C#-Quellcode

    1. public class SetupActivationViewModel : NavigatableScreen<EventArgs> { // whatever }


    Dann mäkelt er CS0311 Der Typ "System.EventArgs" kann nicht als Typparameter "T" im generischen Typ oder in der generischen Methode "NavigatableScreen<T>" verwendet werden. Es ist keine implizite Verweiskonvertierung von "System.EventArgs" in "GUI.ViewModels.ISteppable<System.EventArgs>" vorhanden. an.

    Was läuft hier falsch?

    LG
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Guten Abend,

    Du hast mit ​where T : EventArgs, ISteppable<T> den generischen Typen auf einen Typen beschränkt, der sowohl EventArgs als auch ISteppable<T> implementiert. Dies macht EventArgs schlicht und ergreifend nicht.

    Spekulation:
    Du möchtest bei NavigatableScreen<T> nicht T nach ISteppable<T> einschränken, sondern ISteppable<T> in der Klasse NavigatableScreen<T> implementieren.
    Aus public abstract class NavigatableScreen<T> : Screen where T : EventArgs, ISteppable<T> machst du public abstract class NavigatableScreen<T> : Screen, ISteppable<T>​ where T : EventArgs.

    Gruß
    Christian