Dan*_*phy 7 c# generics inheritance
我有两个接口:
public interface A {
void aMethod();
}
public interface B : A {
void bMethod();
}
Run Code Online (Sandbox Code Playgroud)
后来我基本上使用这样的字典:
Dictionary<int, A> dict = new Dictionary<int, B>();
Run Code Online (Sandbox Code Playgroud)
C#说我无法从右转换,即使我投了它.有没有办法在C#中使用泛型,以便这可以工作?如果我把它们作为抽象类,它似乎没问题,但我需要这些作为接口.
不,这是一个协方差问题.如果你能做到:
Dictionary<int, A> dict = new Dictionary<int, B>();
Run Code Online (Sandbox Code Playgroud)
没有编译器错误就可以将类型A的对象放在dict中.
问题是dict看起来像:Dictionary<int, A>但它确实是类型Dictionary<int, B>()(因此放置一个类型A的对象会因为无效的强制转换而抛出运行时错误),所以不应该让你甚至尝试放置一个A类对象在dict中,这就是为什么你不能这样做:
Dictionary<int, A> dict = new Dictionary<int, B>();
Run Code Online (Sandbox Code Playgroud)
它可以保护您免受运行时错误的影响.
您想查看Eric Lippert关于此主题的博客:http://blogs.msdn.com/b/ericlippert/
这是他最喜欢谈论的话题之一,所以它非常彻底.
| 归档时间: |
|
| 查看次数: |
1787 次 |
| 最近记录: |