带有强制转换异常的C#.NET 4.0泛型协方差问题

时间:2011-04-08 04:59:41

标签: .net generics c#-4.0 covariance contravariance

我一直在与此作斗争,所以任何帮助都会受到赞赏。这是我在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

这非常令人困惑,我不确定我做错了什么。有人请指出我正确的方向。谢谢!

1 个答案:

答案 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,但不能反过来。