在方法中使用协变泛型类型

时间:2018-08-03 08:59:05

标签: c# generics covariance

我正在练习我的协方差,试图全力以赴。

我已经开发了两种类似的方法,一种不变的方法可以按您的预期工作,但是缺少一些高级类型功能,而一种协变量的方法却给我一个错误。

#region Animals
public abstract class Animal { };

public class Lemur : Animal { };

#endregion

public interface IExhibit<out T> where T : Animal
{
}

#region Poster
public interface IPoster<out T> where T : Animal
{
    string GetHeadline();
}

public class Poster<T> : IPoster<T> where T : Animal
{
    public string GetHeadline()
    {
        return typeof(T).ToString();
    }
}
#endregion

public class Zoo
{
    List<IExhibit<Animal>> exhibits;
    List<Poster<Animal>> posters;

    public void AddExhibit(IExhibit<Animal> newExhibit) //option 1
    {
        exhibits.Add(newExhibit);
        posters.Add(new Poster<Animal>()); //poster will just say "animal"
    }

    public void AddExhibit<T>(IExhibit<T> newExhibit) where T : Animal
    {
        exhibits.Add(newExhibit);
        posters.Add(new Poster<T>());
    }
}

希望我所做的足够直观。我知道有很多方法可以做到这一点,但是由于我对理论更感兴趣,因此我试图使这种事情起作用。整个前提是

public void AddExhibit<T>(IExhibit<T> newExhibit) where T : Animal

更有用
public void AddExhibit(IExhibit<Animal> newExhibit)

因为它更具体,我想利用您可以访问类型T的事实。我只是使协方差起作用。我怀疑问题是我使用的是Poster而不是IPoster,但是由于IPoster是一个接口,您无法实例化它。

0 个答案:

没有答案