请考虑以下事项:
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
答案 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是一个类