我们说我们有这些类型:
class A {}
class B : A {}
class X<T> {}
为什么我们不能这样做?
X<A> var = new X<B>();
是否有可用的解决方法?
[编辑] 我尝试使用协方差,但它失败了,因为我想访问X中类型为T的属性,而C#不允许在接口中使用类型T:
interface IX<out T> {
T sth {set; get;}
}
class X<T>: IX<T> {
T sth { set; get; }
}
[编辑2] 我也试过了,但失败了:
class X<T> where T : A
{
public T sth { set; get; }
public static implicit operator X<T>(X<B> v)
{
return new X<T>
{
sth = v.sth,
};
}
}
奇怪的是,C#不允许演员表演。#/ p>
答案 0 :(得分:1)
问题是类不支持协方差和反演,只有接口:
class A { }
class B : A { }
class X<T> : P<T> { }
interface P<out T>
{
}
...
P<A> var = new X<B>();
答案 1 :(得分:1)
您需要协方差(使用单词T
标记类型参数out
):
interface IX<out T> {}
仅允许使用接口类型(和委托类型)。类型B
必须是引用类型(class
,就像这里一样)。
然后这很好:
IX<B> ixb = ...;
IX<A> ok = new IX<B>();