【发布时间】:2020-08-26 09:57:21
【问题描述】:
我有两个可以接受泛型类型参数的泛型函数,我有三个主要类和许多子类
类:Base、Normal、Special
Special 和 Normal 都继承自 base,special 是 final 类,但 normal 有许多子类
我的功能如下
public void doWork<T>() where T:Base
{
list<T> =
typeof(T) == typeof(Special) ?
(List<T>)Convert.ChangeType(GetObjectsSelectedFromSpecial(),typeof(List<T>)) : // this is very ugly
(List<T>)GetObjectsSelectedFromNormal<T>(); // this will not compile
}
GetObjectsSelectedFromSpecial返回Special的列表,这很好
GetObjectsSelectedFromNormal<T> 看起来像这样,并且可以传递Normal 的任何孩子
public List<T> GetObjectsSelectedFromNormal<T>() where T : Normal
{
...
ExternalFunction<T>(); // this needs T to be of type `Normal`
...
}
但在排队
... : (List<T>)GetObjectsSelectedFromNormal<T>();
我得到了错误
类型“T”不能用作泛型类型或方法“myProject.GetObjectsSelectedFromNormal()”中的类型参数“T”。没有从“T”到“Normal”的隐式引用转换。
有没有办法转换泛型类型参数?不是T 类型的对象,而是T 本身的强制转换/强制类型?我看过的所有地方都只是在谈论将变量转换为T
编辑:
Base、Normal 和 Special 是我无法直接更改的框架的内部类,因此无法解决涉及更改类的解决方案
【问题讨论】:
-
GetObjectsSelectedFromNormal
T 对需要特定对象类型的方法的有效论证。在这种情况下,T 只是“Base”而不是“Normal”。这可能就是原因。 -
@MortenBork 好的,但我可以保证
T在运行时将是Normal类型...有没有办法告诉 c# 这段代码没问题?甚至一些hacky? (我来自 c++,不习惯不信任我的语言) -
为什么不在
Special中覆盖DoWork? -
嗯,像
typeof(T) == typeof(Special)这样带有一些类型检查的泛型函数与泛型的目的相矛盾,即“这个函数以相同的方式处理所有类型,而不管实际的T”。 -
这对我来说真的很奇怪。您的
doWork方法采用任何类型的Base类型,但在其中,有一个使用Normal的专用调用?
标签: c# generics casting typecasting-operator