C#泛型铸造型儿童向母公司
比方说,我们有这几种:C#泛型铸造型儿童向母公司
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#不允许铸造的“某事”。
的问题是,类不支持协变和逆变,只有接口:
class A { }
class B : A { }
class X<T> : P<T> { }
interface P<out T>
{
}
...
P<A> var = new X<B>();
你需要协方差(字out
标记类型参数T
):
interface IX<out T> {}
这仅与接口类型(和委托类型)允许的。而类型B
必须是一个引用类型(class
像这里一样)。
然后,这是罚款:
IX<B> ixb = ...;
IX<A> ok = new IX<B>();
类型T的某些属性,因为我有A. – HamedH
类型T的一些财产,我不知道我能跟着你,我不能使用协方差我不能使用协方差。如果一个属性可以被设置,那么不允许'out',因为它会破坏事物。就像如果你有一个IList的''
在__ [编辑2] __,当你说'新X {...}',记住'T'可以与任何具体类型时,可以取代这运行。例如,如果'T'碰巧是'class Evil:A'类型的呢?然后,将类型为'B'的'v.sth'分配到'Evil'类型的属性中。但他们没有兼容的类型。它们之间唯一的“关系”('B'和'Evil')是从'A'派生出来的。所以'B'不是'Evil',所以分配是非法的。由于分配对于一些“T”的替换是非法的,因此分配通常是非法的。 –
@JeppeStigNielsen你说得对[编辑2] – HamedH