2009-09-18 78 views
0
// The Structure of the Container and the items 
public interface IContainer <TItem> where TItem : IItem 
{ 

} 

public class AContainer : IContainer<ItemA> 
{ 

} 

public interface IItem 
{ 

} 

public class ItemA : IItem 
{ 

} 

// Client app 

[Test] 
public void Test() 
{ 
IContainer<IItem> container = new AContainer(); 
} 

问题:在测试中发生以下错误。什么可以成为铸造的解决方案?明确铸造问题

不能将类型'AContainer'隐式转换为'IContainer'。一个显式转换存在(是否缺少强制转换?)

+1

这个问题似乎要拿出大部分时间。发帖前是否搜索过? – thecoop 2009-09-18 09:10:28

回答

3

另一个泛型协变问题...

泛型类型在.NET不是协变或逆变 - 的IContainer <意达>(这是的aContainer是什么)是不是IContainer的子类<IItem> - 两者之间没有有效的转换。这将是固定在C#4

+3

我注意到,在C#4中,我们添加了协变和反变量**,但**仅在接口和委托中使用不同位置的引用类型参数,并且只有那些在编译时已知的接口和委托对变量安全。 – 2009-09-18 14:59:18

1

如果你想使用AContainer是一个IContainer<IItem>,你需要实现这个接口,以及:

public class AContainer : IContainer<ItemA>, IContainer<IItem> 

您可以明确地实现它。