给出以下代码:
public class CustomSection: Section, ISection
{
}
public class Section
{
}
public interface ISection
{
}
当我尝试返回TSection列表时:
private List<TSection> Test<TSection>()
where TSection : Section, ISection
{
return new List<TSection> { (TSection)(new CustomSection()) };
}
我收到错误'无法将类型从'CustomSection'转换为'TSection'。
如果我将其更改为这样,则可以正常工作:
private List<TSection> Test<TSection>()
where TSection : Section, ISection
{
return new List<TSection> { (new CustomSection() as TSection) };
}
导致一种方式导致错误而另一种导致错误之间的细微差别是什么?
答案 0 :(得分:1)
您尝试在继承树上的两个叶节点之间进行转换,这是无效的。考虑一个以Animal
为根的树。如果Dog
和Cat
都扩展Animal
,它们处于相同的继承级别并共享一个公共基类,但您无法将Dog
强制转换为{{1} }}。您可以将它们都转换为Cat
,因为它位于树的较高位置,但您无法在同一级别转换为其他类型。
在您的代码中,Animal
和TSection
在树上处于同一级别,因为它们都延伸CustomSection
(和Section
)。您可以将ISection
投射到CustomSection
,但不能投放到Section
。使用TSection
将进行编译,但除非as TSection
正好null
,否则它将返回TSection
。