以下のコードがc#(.NET Core 1.1)で動作しない理由を理解できません。C#がジェネリックスとインターフェイスに固執しました
public interface IChild
{
}
public interface IParent
{
IEnumerable<IChild> Children { get; set; }
}
public abstract class ParentBase<TChild> : IParent
where TChild : IChild
{
public IEnumerable<TChild> Children {get; set; }
}
エラーメッセージが
エラーCS0738が 'ParentBase < TChild>' インターフェース部材 'IParent.Children' を実装していませんです。 'ParentBase < TChild> .Children'に一致する戻り値の型が 'IEnumerable < IChild>'ではないため、 'IParent.Children'を実装できません。
エラーメッセージは、私がIChildにTChildを制限しながら、IEnumerableを< TChild>がない< IChild> IEnumerableを型であると言います。
私はこの2つの「簡単な」方法を見つけましたが、両方ともクライアントコードにかなり悪い変更が必要です。クライアントコードでConfigurationSection.Bind()を使用して、これらのタイプのオブジェクトツリー全体をロードします。
不要な解決策1:これが動作しない理由は非常に単純です
public interface IChild
{
}
public interface IParent
{
IEnumerable<IChild> Children { get; set; }
}
public abstract class ParentBas<TChild> : IParent
where TChild : IChild
{
public IEnumerable<IChild> Children {get; set; }
}
なぜ一般的な 'ParentBas'を使用していますか?あなたはそれを必要としません - 'IEnumerable 子供たちは'すでにIChildのすべての実装を受け入れていますか? –
Fabio
* "以下のコードがc#で機能しない理由を理解していない" * - インターフェイスとコンクリートクラスの間に矛盾が生じるため、犬の子を猫の親にinterface –
ParentBasはミススペルされています.ParentBaseである必要があります。抽象的なParent基本クラスを持つ目的は、そこにParentの共通機能を実装することです。わかりやすくするために共通のコードを削除しました。 –