无法将类型从Class转换为TClass

时间:2018-01-23 20:49:11

标签: c# generics

给出以下代码:

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) };
}

导致一种方式导致错误而另一种导致错误之间的细微差别是什么?

1 个答案:

答案 0 :(得分:1)

您尝试在继承树上的两个叶节点之间进行转换,这是无效的。考虑一个以Animal为根的树。如果DogCat都扩展Animal,它们处于相同的继承级别并共享一个公共基类,但您无法将Dog强制转换为{{1} }}。您可以将它们都转换为Cat,因为它位于树的较高位置,但您无法在同一级别转换为其他类型。

在您的代码中,AnimalTSection在树上处于同一级别,因为它们都延伸CustomSection(和Section)。您可以将ISection投射到CustomSection,但不能投放到Section。使用TSection将进行编译,但除非as TSection正好null,否则它将返回TSection