2011-06-23 30 views
133

'T' parametresi olarak kullanmak için bir referans tipi olmalıdır, generiklerin daha derinlerine iniyorum ve şimdi bir yardıma ihtiyacım var. Konu başlığında gösterildiği gibi 'Türetilmiş' sınıfında bir derleme hatası alıyorum. Buna benzer birçok başka yazı görüyorum ama ilişkiyi göremiyorum. Birisi bunu nasıl çözeceğimi söyleyebilir mi?Tip, jenerik tip veya metod

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

Herhangi bir derleme hatası bulamadım –

+0

Bu kod bu hatayı göstermiyor. Temiz bir şekilde derler. –

cevap

313

Ben REPRO olamaz, ama ben gerçek kodunda bir kısıt T : class bir yerde olduğunu şüpheli - İhtiyacınız , derleyici mutlu etmek (örneğin sert bir üreme örneğin yapmadan emin söylemek) o yaymak için:

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

Teşekkür ederim, evet bu kadar. Sınıf kısıtlamasını ekledikten sonra derleme hatası giderildi. Aşağıdaki refernce tipi ihtiyacını tatmin ediyor gibi görünüyor. – ChrisS

+0

İşte işe yarar. sınıf, IModel { kamu baz (IView görünüm) { } } genel sınıf Türetilmiş: T genel sınıf temel SomeModel Taban : sınıfı IModel { halka Türetilmiş (IView görünüm) : taban (görünüm) { SomeModel m = (SomeModel) Activator.CreateInstance (typeof (SomeModel)); Service s = yeni Hizmet (); s.Work (m); } } – ChrisS

+0

Yardımcı oldu :) Teşekkürler :) Bir yan not olarak, IMO arabiriminde zaten uygulanmışsa aynı constrait'u bir daha kopyalamamalıyız. – Celdor

33

Eğer olmasının T kısıtlı olması bu hatayı olsun bir class

5

generic bir sınıf veya metho üzerinde baskılar da ise d, onu kullanan diğer tüm genel sınıflar ya da yöntemler, en azından bu kısıtlamalara sahip olmak zorundadır.