4

次のように定義された2つのクラスがあります

public class PostleitzahlList : ObservableCollection<Postleitzahl> {
}

public class Postleitzahl : IPostleitzahl {
}

今、私は含むサービスクラスを持っています

PostleitzahlList _postleitzahlList;

この Serviceclass は、返される Service-Interface の Property も実装する必要があります_postleitzahlListが、この Interface は知っているだけで、またはIPostleitzahl知らない. このプロパティは、WPF のバインドに使用する必要があります。PostleitzahlListPostleitzahl

私は今、このプロパティを宣言して実装しようとしています。私が試してみました

    public ObservableCollection<IPostleitzahl> PostleitzahlList {
        get { return this._postleitzahlList; }
    }

    public IList<IPostleitzahl> PostleitzahlList {
        get { return this._postleitzahlList; }
    }

しかし、どちらも機能しません。休養はうまくいくようです:

    public IEnumerable<IPostleitzahl> PostleitzahlList {
        get { return this._postleitzahlList; }
    }

私は今私に尋ねます 1.なぜ最初と2番目の試みがうまくいかないのですか? 2.これを解決するための最良の解決策は何ですか?

4

2 に答える 2

6

問題は共分散にあります。AnObservableCollection<Postleitzahl>は ではなく、ObservableCollection<IPostleitzahl>リストの場合も同様です。以下に、そうでない理由の例を示します。

ObservableCollection<string> strings = new ObservableCollection<string>();

// This is invalid, but it's what you're trying to do, effectively.
ObservableCollection<object> objects = strings;

// This would have to work... it's fine...
objects.Add(new object());

// And this should be fine too...
string x = strings[0];

...しかし、ご覧のとおり、文字列以外の参照を取得して文字列変数に格納しようとしています。唯一の実行可能な結果は、実行時の失敗です...そして、ジェネリックのポイントの半分は、エラー検出をコンパイル時にプッシュすることです。

それを介してアイテムを追加できないため、共変IEnumerable<T>になりました。これにより、その種の変換を安全に適用できます。T

// There's nothing you can do to violate type safety here...
Observable<string> strings = new ObservableCollection<string>();
IEnumerable<object> objects = strings;

詳細については、MSDN のジェネリックにおける共分散と反分散を参照してください。

IPostleitzahlインターフェイスは必要ですか?ObservableCollection<Postleitzahl>またはを介し​​てプロパティを公開しただけであればIList<Postleitzahl>問題ありません。または、変数を に変更し、ObservableCollection<IPostleitzahl>たまたまPostleitzahlインスタンスを作成して値を設定することもできます。

于 2012-05-22T11:40:05.643 に答える
0

PostleitzahlList を次のように変更できますか

public class PostleitzahlList : ObservableCollection<IPostleitzahl> {
}

?IPostleitzahlの代わりにelementtypeを使用Postleitzahl

説明については、@ jon skeetの回答を参照してください

于 2012-05-22T11:44:56.993 に答える