所以我真正的方法有很多不同,但我会谈到这一点。在我使用泛型方法时,似乎我不完全理解如何处理泛型<T>
类型。我的理解是,当我们希望相同的逻辑适用于不同类型时,我们使用泛型方法,但我们希望在运行时自由确定确切的类型。因此,当我有这样的方法时,我觉得很自然:
internal static void ChangeCode<T>(Entity entity) where T : Entity
{
T tempEntity;
if (entity.GetType() == typeof(SomeMoreSpecificEntity))
{
tempEntity = new SomeMoreSpecificEntity();
}
}
但是如果我尝试这样的话,我会收到错误Can not convert type T to SomeMoreSpecificEntity
。
所以我错了。是不是能够做到这一点 - 在编译时声明一个通用类型并在运行时转换为更具体的类型?
答案 0 :(得分:4)
你做不到。检查以下情况:
你有另一个名为SomeMoreSpecificEntity2
的类,它被声明为:
class SomeMoreSpecificEntity2 : Entity
{
}
您调用方法ChangeCode<SomeMoreSpecificEntity2>
,因此T
为SomeMoreSpecificEntity2
,因此tempEntity
也是SomeMoreSpecificEntity2
,但您正在尝试分配SomeMoreSpecificEntity
1}}到它。那不行。
您可以尝试将其更改为:
internal static void ChangeCode<T>(Entity entity) where T : Entity
{
Entity tempEntity;
if (entity.GetType() == typeof(SomeMoreSpecificEntity))
{
tempEntity = new SomeMoreSpecificEntity();
}
}
它编译。</ p>
答案 1 :(得分:3)
不,您尝试编写的代码已损坏。例如,假设我打电话:
ChangeCode<BananaEntity>(new SomeMoreSpecificEntity());
这会尝试将SomeMoreSpecificEntity
类型的引用分配给T
类型的变量,其中T
为BananaEntity
。
目前尚不清楚您要实现的目标,但这就是您当前代码无法编译的原因。鉴于你实际上并不是使用 T
而不是为了它无法正常工作的目的,你可以更改当前代码以使其成为非泛型方法,只需将tempEntity
声明为Entity
类型。当然,这可能不适用于您真正想要做的事情,但由于您只提供了非工作代码,因此很难确定:(
关于这一行的三点:
if (entity.GetType() == typeof(SomeMoreSpecificEntity))
entity
属于T
类型而非类型Entity
?目前它可以是任何实体is
而不是调用GetType
并将其直接与类型进行比较答案 2 :(得分:-3)
tempEntity = (T)(object)new SomeMoreSpecificEntity();
T只能使用对象
进行转换