0

次のコードがあります。

class Header<TItem> where TItem : IItem { IEnumerable<TItem> Item { get; set; } }
class HeaderA : Header<ItemA> { public HeaderA(int a) {...} } 
class HeaderB : Header<ItemB> { public HeaderB(int b) {...} } 

interface IItem {...}
class ItemA : IItem { }
class ItemB : IItem { }

public static List<Header<IItem>> list = new List<Header<IItem>> 
{
    new HeaderA(1)
}

最後のコンパイルエラーnew HeaderA(1)

Error   1   The best overloaded Add method
'System.Collections.Generic.List<NS.Header<NS.IItem>>.Add(NS.Header<NS.IItem>)'
for the collection initializer has some invalid arguments

問題を解決するには?

4

1 に答える 1

7

を に追加しようとしてHeader<ItemA>List<Header<IItem>>ます。それにはHeader<ItemA>からHeader<IItem>- への変換が必要ですが、その変換は存在しません。正当な理由で存在しません。あなたのコードが有効であると想像してください...そしてこれはうまくいくでしょう:

List<Header<IItem>> list = ...; // As per code
Header<IItem> header = list[0];
header.Item = new List<IItem>();

headerこれは実際には aであることを思い出してください。HeaderAしたがって、この動作はこの HeaderA header = new HeaderA(); と同等です。header.Item = new List { new ItemB() };

これは他の何かheader.ItemIEnumerable<ItemA>();

ItemA itemA = header.Item.First();

...そこに を追加した場合は明らかにそうではありませんItemB

基本的に、一般的な共分散を探しています-しかし、それを宣言できるのは、インターフェイスとデリゲート ( などのクラスではなくHeader<TItem>) でのみであり、型パラメーター入力位置で使用されていない場合にのみ、Itemセッターが原因でここにあります.

おそらくもっと重要なことは、あなたのデザインは非常に複雑に見えるということです。

于 2012-09-13T23:30:18.083 に答える