派生类型不能隐式转换为基接口

时间:2010-11-09 10:46:27

标签: .net-3.5 inheritance interface c#-3.0

interface IModel {}

class MyModel : IModel {}

interface IRepo<T>
    where T: IModel { }

class Repo : IRepo<MyModel> { }

//EDIT: A smaller example
IRepo<IModel> repo = new Repo(); // Cannot implicitly convert.. An explicit convertion exists. Missing cast?

// Old example:
/*
The type 'Repo' cannot be used as type parameter 'C' in the generic type or method.
'Castle.MicroKernel.Registration.ComponentRegistration<S>.ImplementedBy<C>()'.
==> There is no implicit reference conversion from 'Repo' to 'IRepo<IModel>'.
*/
container.Register(
    Component.For<IRepo<IModel>>()
   .ImplementedBy<Repo>());

但Repo源自IRepo,而MyModel源自IModel。为什么这不起作用?

我尝试在Repo上添加隐式运算符,但不允许在接口之间进行转换..

这是由c#4中的co / contra varience事件解决的(不,我不知道我在说什么:))?

2 个答案:

答案 0 :(得分:3)

你是对的。由于Co / Contravariance,它不起作用。它应该在C#4中工作(我没有测试它,因为我从来不需要这样的东西:P)。

有关其工作原理的详细说明,请访问:http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

答案 1 :(得分:2)

你的直觉是正确的。这是一个协方差问题。您看,IRepo<IModel>IRepo<MyModel>不一样。

要允许协变类型,您可以使用C#4中的out修饰符修复它:

interface IRepo<out T> where T: IModel {}

如果您尚未使用C#4,则需要加强使用:

IRepo<MyModel> repo = new Repo();