2011-06-23 8 views
133

ジェネリックスをさらに深く理解しています。件名に表示されているように、下の 'Derived'クラスでコンパイルエラーが発生します。私はこのような他の多くの記事を参照してくださいが、私は関係を見ていないよ。誰かがこれを解決する方法を教えてもらえますか?ジェネリック型またはメソッドでパラメータ 'T'として使用するには、型を参照型にする必要があります。

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

コンパイルエラーはありません –

+0

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

答えて

313

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

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

ありがとう、そうです。クラスの制約を追加すると、コンパイルエラーはなくなりました。以下は、参照型の必要性を満たすと思われる。 – ChrisS

+0

ここに何が機能しているのですか?パブリッククラスベース T:を派生クラス、IModelを { 公衆基地(たIView ビュー) { } } パブリッククラス:ベース SomeModel:派生クラス、IModelを { パブリック(たIView ビュー) :ベース(ビュー) { SomeModel m =(SomeModel)Activator.CreateInstance(typeof(SomeModel)); サービス s =新しいサービス(); s.Work(m); } } – ChrisS

+0

ありがとう:)ありがとう:) 私は、インターフェイス、IMOに既に適用されている場合、同じconstraitを何度もコピーしないでください。 – Celdor

33

あなたがあることにTを制約している場合は、このエラーを取得するclass

5

あなたはジェネリッククラスまたはメト上の制約を置く場合d、それを使用している他のすべての汎用クラスまたはメソッドは、少なくともそれらの制約を持つ必要があります。

関連する問題