我收到以下编译错误
无法将类型'T'转换为 'ProjectReportingHandler'
为行
var projectReport = (ProjectReportingHandler)result.Report;
尝试编译时:
public abstract class ReportingHandler
{
// Report stuff
}
public abstract class ProjectReportingHandler: ReportingHandler
{
// Report stuff
// Project specific report stuff
}
public class ReportInstance<T>
where T : ReportingHandler
{
public T Report { get; private set; }
}
public class ReportLibraryEntry<T>
where T : ReportingHandler
{
public ReportInstance<T> Create()
{
ReportInstance<T> result = new ReportInstance<T>();
if (result.Report is ProjectReportingHandler)
{
var projectReport = (ProjectReportingHandler)result.Report;
// do stuff with project reports
}
return result;
}
}
如何将链接的泛型类型属性result.Report
强制转换为ProjectReportingHandler
?
我原以为where T : ReportingHandler
会确保这是可能的:(
public ReportInstance<T> Create()
{
ReportInstance<T> result = new ReportInstance<T>();
ReportingHandler report = result.Report;
if (report is ProjectReportingHandler)
{
var projectReport = (ProjectReportingHandler)report;
// do stuff with project reports
}
return result;
}
为什么下来投票给一个有效的答案? :(
答案 0 :(得分:4)
where T : ReportingHandler
还不够。
如果T
是继承ReportingHandler
而非ProjectReportingHandler
的其他类型会发生什么?
如果您确定T
将始终从ProjectReportingHandler
继承,则可以将约束更改为where T : ProjectReportingHandler
。
如果你真的想按照你现在的方式去做,你应该先投射到ReportingHandler
,如下所示:
var projectReport = ((ReportingHandler)result.Report) as ProjectReportingHandler;
如果T
未继承ProjectReportingHandler
,则projectReport
将为null
。
答案 1 :(得分:3)
T:ReporingHandler不保证转换是可能的。仅仅因为ProjectReportingHandler是一个ReportingHandler并不意味着相反的情况。
答案 2 :(得分:1)
如何使用as
:
ReportInstance<T> result = new ReportInstance<T>();
var projectReport = result.Report as ProjectReportingHandler;
if (projectReport != null)
{
//do stuff
}
答案 3 :(得分:0)
你可以通过首先将结果“作弊”。记录到一个对象,然后再到一个ProjectReportingHandler。