C # .NET 4.0 общая проблема ковариации с исключением приведения - PullRequest
1 голос
/ 08 апреля 2011

Я боролся с этим некоторое время, поэтому любая помощь будет принята с благодарностью. Вот сценарий, с которым я столкнулся на 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 Ответ

3 голосов
/ 08 апреля 2011

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, но не наоборот.

...