2016-05-23 10 views
0

引数 'グループ<IItem>'

    • グループ
      • 項目
        • 属性
        • 属性
    • グループ
      • 項目
        • 属性
        • 属性
  • [...]

私は、このように、このアーキテクチャをインスタンス化しようとしている:

var sections = new List<ISection> 
{ 
    new Section("Section Header", new List<Group<IItem>> 
    { 
     new SpecificGroupType1(token, "GroupName") 
    } 
}; 

SpecificGroupType1は、適切なIItemの新しいリストをスピンアップタイプ。

でも、私は次のエラーを取得しています:

Argument SpecificGroupType1 is not assignable to parameter type Group<IItem> 

私も、なぜ非常にわからないんだけど、SpecificGroupType1グループから継承するため。

完全なアーキテクチャは、この(IAttributeのものにも関与して取得する前に、私はに実行している問題が発生したので、私は、IAttributeのものを省略)のようになります。

Section.cs

public interface ISection { // Stuff } 

public class Section : ISection 
{ 
    public Section(string sectionName, IList<Group<IItem>> groups) 
    { 
     Name = sectionName; 
     Groups = groups; 
    } 
} 

Group.cs

public interface IGroup { // Stuff } 

public abstract class Group<T> : IGroup where T : IItem 
{ 
    protected Group(JToken token, string groupName) 
    { 
     Name = groupName; 
     Items = new List<IItem>(); 

     foreach (var itemToken in Token.Children()) 
     { 
      Items.Add((Item)Activator.CreateInstance(typeof(T), itemToken); 
     } 
    } 

    public string Name { get; internal set; } 
    public JToken Token { get; internal set; } 

    protected IList<IItem> Items { get; set; } 
} 

SpecificGroupType1.cs

public class SpecificGroupType1 : Group<SpecificItemType1> 
{ 
    public SpecificGroupType1(JToken token, string groupName) : base(token, groupName) {} 

    // Stuff 
} 

Item.cs

public interface IItem { // Stuff } 

public abstract class Item : IItem 
{ 
    protected ConfigurationItem(JToken token) 
    { 
     Attributes = new List<IAttribute>(); 
     Token = token; 
    } 

    public IList<IAttribute> Attributes { get; set; } 
    public JToken Token { get; set; } 
} 

SpecificItemType1。CS

public class SpecificItemType1 : Item 
{ 
    public SpecificItemType1(JToken token) : base(token) {} 

    // Stuff 
} 
+0

あなたのコードで表示されている問題の1つは、IGroup ですが、IGroupの宣言には一般的なパラメータがありません。どこかに汎用的なインターフェース定義が追加されていない限り、コンパイルに失敗します。 – recursive

+0

おっと、それはタイプミスでした。実際には私のコードでIList >です。 – jrsowles

+0

SpecificItemType1の定義がありますか?それはItemから継承していますか? – Bill

答えて

2

基本的に、これはあなたの一般的なパラメータに問題があります。この簡単な例を考えてみましょう。

// does not compile 
Group<IItem> g = new SpecificGroupType1(token, "GroupName"); 

// does compile 
Group<SpecificItemType1> g = new SpecificGroupType1(token, "GroupName"); 

問題はSpecificGroupType1Group<IItem>同じないクラスGroup<SpecificItemType1>を実装することです。このようにしてより多くの派生ジェネリックパラメータタイプを使用できるようにするには、共変ジェネリックパラメータ宣言を使用する必要があります。 C#では、クラスではなくインターフェイスでのみ可能です。したがって、少しリファクタリングする必要があるかもしれません。それはこのようなものでしょう。

interface IGroup<out T> : IGroup where T: IItem { 
    // declarations 
} 

キーワードはoutです。

関連する問題