如何从C#中的闭合构造类中获取基类对象

时间:2015-01-11 17:45:11

标签: c# generics inheritance compiler-errors

只是另一个小C#培训应用程序,只是另一个编译错误,但它不能只是离我而去......我只是想知道,我在这里做错了什么:

public abstract class Material
{

}

public abstract class Cloth<T> where T:Material
{
    public T Prop { get; set; }
}

public class Cotton : Material
{

}

public class Dress<T> : Cloth<T> where T : Material
{

}

public class Test
{
    private Cloth<Material> cloth;

    public Test()
    {
        /* below won't compile */
        cloth = new Dress<Cotton>();
    }
}

我想从一个封闭的构造类中获取基类对象。任何人?

尝试编译时出现错误:

Cannot implicitly convert type Dress<Cotton> to Cloth<Material> 

1 个答案:

答案 0 :(得分:1)

您希望实现的目标称为协方差see the following article for samples)。

不幸的是,对类没有任何差异支持:它仅限于接口和委托。

因此,您可以设计一个名为ICloth<T>的接口,其中包含T协变:

public interface ICloth<out T>
{
    T Prop { get; set; }
}

并在任何可能的布料中实施,包括Cloth<T>

现在将cloth键入ICloth<T>,您的作业应该有效(即cloth = new Dress<Cotton>();),因为Dress<Cotton>ICloth<out T>,这是一个T的接口{1}}协变通用参数。

详细了解带有差异in the following article on MSDN的通用界面。