C#通用强制转换
我有一个无法解决的铸造问题: 在ClassA initialize函数中,我想将“this”作为参数传递,但是编译器不能从C#通用强制转换,c#,casting,C#,Casting,我有一个无法解决的铸造问题: 在ClassA initialize函数中,我想将“this”作为参数传递,但是编译器不能从ClassA转换到ClassA,因为知道它们是相同的(其中T:ClassB) 公共类ClassA:MonoBehavior其中T:ClassB { 公共无效初始化() { T项=。。。 item.Initialize(this);//无法隐式地从ClassA转换为ClassA。 } } 公共B类:单一行为 { 公共虚拟无效初始化(ClassA管理器,T数据) { ... }
ClassA
转换到ClassA
,因为知道它们是相同的(其中T:ClassB
)
公共类ClassA:MonoBehavior其中T:ClassB
{
公共无效初始化()
{
T项=。。。
item.Initialize(this);//无法隐式地从ClassA转换为ClassA。
}
}
公共B类:单一行为
{
公共虚拟无效初始化(ClassA管理器,T数据)
{
...
}
}
谢谢。考虑一下:
大象:动物
;这并不意味着List:List
,您不能将List
转换为List
,原因有很多(包括:在转换为List
后,您可以将(猴子)
添加到列表
,因为猴子:动物
)。这在概念上是完全相同的 这对类不起作用。只有当ClassB
是一个带有out
类型参数的接口时,它才起作用,如下所示:
public interface IInterfaceB<out T>
{
…
}
公共接口界面b
{
…
}
但是,out类型参数意味着您只能将类型参数
T
用于IIinterfaceB
接口成员中的返回值,而不能用于参数。您尝试了什么,出现了什么错误?为什么您认为可以从ClassA
转换为ClassA
?泛型类是不变的。例如,您不能将列表
强制转换为列表
。这里也发生同样的事情。A和B不一样。你可以从B到A,但不能从A到B。假设B是一个最多可以容纳50个弹珠的盒子。A是一个最多可以容纳100个弹珠的盒子。你总是可以把B放进A。但是如果你把A放进B,地板上可能会有很多大理石。可能的重复:@Grit这并不意味着“相同”;这意味着允许任何T
,即ClassB
,或继承自ClassB
,我认为这应该添加到C#泛型类型的MSDN文档中
public interface IInterfaceB<out T>
{
…
}