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)
        {

        }
    }
}

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

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.