【发布时间】:2017-06-18 12:48:40
【问题描述】:
假设我们有这些类型:
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# 不允许对 'sth' 进行强制转换。
【问题讨论】:
-
在 [Edit 2] 中,当您说
new X<T> { ... }时,请记住T在运行时可以替换为任何具体类型。例如,如果T恰好是class Evil : A类型怎么办?然后将v.sth类型为B分配给Evil类型的属性。但它们没有兼容的类型。它们之间唯一的“关系”(B和Evil)是两者都派生自A。所以B不是Evil,所以分配是非法的。由于T的某些替换赋值是非法的,所以一般来说赋值是非法的。 -
@JeppeStigNielsen 你是对的 [编辑 2]
标签: c# generics inheritance