1

我已经为此奋斗了一段时间,所以任何帮助将不胜感激。这是我在 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

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

4

1 回答 1

3

逆变 (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;

您可以分配inBinA,但不能反过来。您可以分配outAoutB,但不能反过来。

于 2011-04-08T05:11:53.543 回答