Tür, genel tür veya yöntemde 'T' parametresi olarak kullanılabilmesi için bir başvuru türü olmalıdır


211

Jenerik bilim hakkında daha derinlere iniyorum ve şimdi yardıma ihtiyacım olan bir durum var. Aşağıdaki 'Derived' sınıfında konu başlığında gösterildiği gibi derleme hatası alıyorum. Buna benzer başka birçok yayın görüyorum, ancak ilişkiyi görmüyorum. Birisi bana bunu nasıl çözeceğimi söyleyebilir mi?

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

        }
    }
}

Herhangi bir derleme hatası
almıyorum

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

Yanıtlar:


474

Üreme edemem, ama gerçek kodunuzda bir yerde bir kısıtlama olduğundan şüpheleniyorumT : class - örneğin derleyiciyi mutlu etmek için yaymanız gerekiyor (örneğin bir repro örneği olmadan kesin olarak söylemek zor):

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

12
Teşekkür ederim, evet bu kadar. Sınıf kısıtlamasını ekledikten sonra derleme hatası ortadan kalktı. Aşağıdakiler, refernce tipine olan ihtiyacı karşılamaktadır.
ChrisS

İşte işe yarayan. public class Base <T> burada T: class, IModel {public Base (IView <T> görünümü) {}} public class Türetilmiş <SomeModel>: Base <SomeModel> burada SomeModel: class, IModel {public Derived (IView <SomeModel> view): base (view) {SomeModel m = (SomeModel) Aktivatör.CreateInstance (typeof (SomeModel)); Hizmet <SomeModel> s = yeni Hizmet <SomeModel> (); s.Work (m); }}
ChrisS

Yardımcı oldu :) Teşekkürler :) Bir yan not olarak, ben zaten arayüz, IMO uygulanmışsa aynı konstrait tekrar tekrar olmamalıdır düşünüyorum.
Celdor


9

Genel bir sınıfa veya yönteme kısıtlama koyarsanız, bunu kullanan diğer tüm genel sınıflar veya yöntemler "en azından" bu kısıtlamalara sahip olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.