2011-06-23 12 views
133

Wchodzę głębiej w generycznych i mam teraz sytuację, w której potrzebuję pomocy. Dostaję błąd kompilacji w poniższej klasie "Pochodny", jak pokazano w tytule tematu. Widzę wiele innych postów podobnych do tego, ale nie widzę związku. Czy ktoś może mi powiedzieć, jak rozwiązać ten problem?Typ musi być typem odniesienia, aby użyć go jako parametru "T" w typie ogólnym lub metodzie

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

     } 
    } 
} 
+0

Nie otrzymuję żadnych błędów kompilacji –

+0

Ten kod nie wyświetla tego błędu. Kompiluje się czysto. –

Odpowiedz

313

nie mogę powtórzenia błędu, ale podejrzany że w rzeczywistym kodzie istnieje ograniczenie gdzieś, że T : class - trzeba propagować że aby kompilator szczęśliwy, na przykład (trudno powiedzieć na pewno bez Repro przykład):

public class Derived<SomeModel> : Base<SomeModel> where SomeModel : class, IModel 
                    ^^^^^ 
                   see this bit 
+6

Dziękuję, tak to wszystko. Po dodaniu ograniczenia klasy błąd kompilacji zniknął. Poniższe zdaje się spełniać potrzeby typu refernce. – ChrisS

+0

o to, co działa. Klasa publiczna baza gdzie T: klasa, IModel { bazowej publicznej (IView widoku) { } } klasy publicznej pochodne : Podstawa gdzie SomeModel: klasa, IModel { publicznego pochodne (IView view) : podstawa (widok) { SomeModel m = (SomeModel) Activator.CreateInstance (typeof (SomeModel)); Usługa s = nowa usługa (); s.Work (m); } } } – ChrisS

+0

Pomógł również :) Dzięki :) Uważam, że nie powinniśmy ponownie kopiować tej samej konstytucji, jeśli została już zastosowana w interfejsie, IMO. – Celdor

33

dostać ten błąd, jeśli masz ograniczony T do bycia class

5

Jeśli umieścisz ograniczenia co na rodzajowego klasy lub meto d, każda inna generyczna klasa lub metoda, która go używa, muszą mieć "przynajmniej" te ograniczenia.

Powiązane problemy