我一直在与此作斗争,所以任何帮助都会受到赞赏。这是我在C#.NET 4.0上遇到的情况。
public interface ITableBusinessLogicLayerIn<in TTableRecord> : IBusinessLogicLayer
where TTableRecord : ITableRecord
{
// No definition
}
public interface ITableBusinessLogicLayerOut<out TTableRecord> : IBusinessLogicLayer
where TTableRecord : ITableRecord
{
// No definition
}
我有一个实现两个接口的对象。代码编译好。但是在运行时,我能够按如下方式转换此对象:
(ITableBusinessLogicLayerOut<ITableRecord>)obj
但不是这样:
(ITableBusinessLogicLayerIn<ITableRecord>)obj
这非常令人困惑,我不确定我做错了什么。有人请指出我正确的方向。谢谢!
答案 0 :(得分:3)
Contravariance(in)允许您将具有较少特定类型的类型参数的对象强制转换为更具体类型之一。例如,您不能将对象传递给期望字符串的类型,因此您无法将期望字符串的类型转换为期望对象的类型。有关详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/ee207183%28d=lightweight%29.aspx
给出以下示例:
class MyTableRecord : ITableRecord { }
ITableBusinessLogicLayerIn<ITableRecord> inA;
ITableBusinessLogicLayerIn<MyTableRecord> inB;
ITableBusinessLogicLayerOut<ITableRecord> outA;
ITableBusinessLogicLayerOut<MyTableRecord> outB;
您可以将inB
分配给inA
,但不能反之。您可以将outA
分配给outB
,但不能反过来。