ジェネリック型またはジェネリックメソッドでパラメーター 'T'として使用するには、型が参照型である必要があります


211

ジェネリック医薬品についてさらに深く理解し、サポートが必要な状況になりました。件名に示すように、以下の「派生」クラスでコンパイルエラーが発生します。私はこれに似た他の多くの投稿を見ますが、私は関係を見ていません。誰かがこれを解決する方法を教えてもらえますか?

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

        }
    }
}

コンパイルエラーは発生しません
Vince Panuccio

このコードはそのエラーを示していません。きれいにコンパイルします。
マークグラベル

回答:


474

私は再現できませんが、実際のコードにはどこかに制約があると思われますT : class-たとえば、コンパイラーを幸せにするためにそれを伝播する必要があります(再現例なしでは確実に言うのは難しい):

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

12
ありがとう、そうです。クラス制約を追加すると、コンパイルエラーはなくなりました。以下は参照型のニーズを満たしているようです。
ChrisS

これが機能します。public class Base <T> where T:class、IModel {public Base(IView <T> view){}} public class Derived <SomeModel>:Base <SomeModel> where SomeModel:class、IModel {public Derived(IView <SomeModel> view):base(view){SomeModel m =(SomeModel)Activator.CreateInstance(typeof(SomeModel)); Service <SomeModel> s = new Service <SomeModel>(); s.Work(m); }}
ChrisS

同様に助けられました:)おかげで:)付記として、私は同じ制約をIMOのインターフェースにすでに適用している場合は何度もコピーしないでください。
セルドール2014年

46

に制限Tされている場合、このエラーが発生しますclass


9

ジェネリッククラスまたはジェネリックメソッドに制約を課す場合、それを使用している他のすべてのジェネリッククラスまたはメソッドには、「少なくとも」それらの制約が必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.