4

我有两个类定义为

public class PostleitzahlList : ObservableCollection<Postleitzahl> {
}

public class Postleitzahl : IPostleitzahl {
}

现在我有一个服务类,其中包含

PostleitzahlList _postleitzahlList;

这个服务类还必须实现一个服务接口的属性,它返回_postleitzahlList——但这个接口只知道IPostleitzahl——它不知道PostleitzahlListPostleitzahl。此属性应用于 WPF 中的绑定。

我现在正在尝试声明和实现此属性。我试过了

    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.解决这个问题的最佳解决方案是什么?

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];

...但是如您所见,您现在正尝试获取非字符串引用并将其存储在字符串变量中。唯一可行的结果是执行时失败……而泛型的一半是将错误检测推到compile-time

NowIEnumerable<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>or暴露属性IList<Postleitzahl>就可以了。或者,您可以将变量更改为 anObservableCollection<IPostleitzahl>并且恰好通过创建Postleitzahl实例来填充它。

于 2012-05-22T11:40:05.643 回答
0

你能把 PostleitzahlList 改成

public class PostleitzahlList : ObservableCollection<IPostleitzahl> {
}

用 elementtypeIPostleitzahl代替Postleitzahl?

有关解释,请参阅@jon skeet 答案

于 2012-05-22T11:44:56.993 回答