Der Typ muss ein Referenztyp sein, um ihn als Parameter 'T' im generischen Typ oder in der generischen Methode verwenden zu können

211

Ich beschäftige mich tiefer mit Generika und habe jetzt eine Situation, in der ich Hilfe brauche. Ich erhalte einen Kompilierungsfehler für die unten stehende Klasse 'Abgeleitet', wie im Betreff angegeben. Ich sehe viele ähnliche Beiträge, aber ich sehe die Beziehung nicht. Kann mir jemand sagen, wie ich das lösen kann?

using System;
using System.Collections.Generic;


namespace Example
{
    public class ViewContext
    {
        ViewContext() { }
    }

    public interface IModel
    {
    }

    public interface IView<T> where T : IModel 
    {
        ViewContext ViewContext { get; set; }
    }

    public class SomeModel : IModel
    {
        public SomeModel() { }
        public int ID { get; set; }
    }

    public class Base<T> where T : IModel
    {

        public Base(IView<T> view)
        {
        }
    }

    public class Derived<SomeModel> : Base<SomeModel> where SomeModel : IModel
    {

        public Derived(IView<SomeModel> view)
            : base(view)
        {
            SomeModel m = (SomeModel)Activator.CreateInstance(typeof(SomeModel));
            Service<SomeModel> s = new Service<SomeModel>();
            s.Work(m);
        }
    }

    public class Service<SomeModel> where SomeModel : IModel
    {
        public Service()
        {
        }

        public void Work(SomeModel m)
        {

        }
    }
}
ChrisS
quelle
Ich bekomme keine Kompilierungsfehler
Vince Panuccio
Dieser Code zeigt diesen Fehler nicht an. Kompiliert sauber.
Marc Gravell

Antworten:

474

Ich kann nicht repro, aber ich vermute, dass es in Ihrem eigentlichen Code irgendwo eine Einschränkung gibt, die T : class- Sie müssen diese weitergeben, um den Compiler zum Beispiel glücklich zu machen (ohne ein Repro-Beispiel sicher schwer zu sagen):

public class Derived<SomeModel> : Base<SomeModel> where SomeModel : class, IModel
                                                                    ^^^^^
                                                                 see this bit
Marc Gravell
quelle
12
Danke, ja das war's. Nachdem ich die Klasseneinschränkung hinzugefügt hatte, verschwand der Kompilierungsfehler. Das Folgende scheint die Notwendigkeit eines Referenztyps zu befriedigen.
ChrisS
Hier ist was funktioniert. public class Base <T> wobei T: class, IModel {public Base (IView <T> view) {}} public class Abgeleitet <SomeModel>: Base <SomeModel> wobei SomeModel: class, IModel {public Derived (IView <SomeModel>) view): base (view) {SomeModel m = (SomeModel) Activator.CreateInstance (typeof (SomeModel)); Service <SomeModel> s = neuer Service <SomeModel> (); Arbeit (m); }}
ChrisS
Hat auch geholfen :) Danke :) Als Randnotiz denke ich, wir sollten die gleiche Einschränkung nicht immer wieder kopieren, wenn sie bereits in der Schnittstelle IMO angewendet wird.
Celdor
46

Sie erhalten diesen Fehler, wenn Sie sich darauf beschränkt haben, a Tzu seinclass

thekip
quelle
9

Wenn Sie einer generischen Klasse oder Methode Einschränkungen auferlegen, muss jede andere generische Klasse oder Methode, die sie verwendet, "mindestens" diese Einschränkungen haben.

Guish
quelle