我不确定为什么这种替代是不安全的

时间:2014-02-28 06:08:26

标签: c# type-conversion covariance out type-parameter

请考虑以下事项:

class ControllerFactoryBase<P> : where P : PledgeReadOnly
{
    public void Foo()
    {
         PledgeRepositoryReadOnly<P> repos = PledgeRepository();
         new AdminController(repos); // compilation error here
    }
}

public interface PledgeRepositoryReadOnly<out P> where P : PledgeReadOnly
{
    IEnumerable<P> GetPledgesToBeneficiary();

}

public class AdminController
{
    public AdminController(PledgeRepositoryReadOnly<PledgeReadOnly> pledgeProvider)
    { ... }
}

我在AdminController实例化时收到编译错误消息:

cannot convert from 'PledgeRepositoryReadOnly<P>' to 'PledgeRepositoryReadOnly<PledgeReadOnly>'

我不知道为什么。我相信这种替代是安全的。你能帮我理解为什么不是吗?

修改更易消化的演示文稿:http://csharppad.com/gist/9283391

1 个答案:

答案 0 :(得分:1)

有一步,最后,我得到了什么错 第一

public interface PledgeReadOnly
{

}

这是一个界面,

where P : PledgeReadOnly

它意味着p必须是PledgeReadOnly 但

public struct x : PledgeReadOnly
{
}

public class y : PledgeReadOnly
{
}

类和结构,并从接口实现 不确定P是类还是结构 您可以将PledgeReadOnly从接口更改为类 或者你可以改变所有

where P : PledgeReadOnly

where P : class,PledgeReadOnly

确保P是一个类