Подтвердить что ты не робот

Что делает "в" общий параметр?

Пила эту подпись сегодня:

public interface ISomeInterface<in T>

Какое влияние имеет параметр in?

4b9b3361

Ответ 1

Вы можете прочитать об общей дисперсии и контравариантности, представленной в .NET 4.0. Влияние, которое имеет ключевое слово in на интерфейсе, заключается в том, что оно объявляет его контравариантным значением, что T может использоваться только как тип метода ввода. Вы не можете использовать его как возвращаемый тип для методов этого интерфейса. Преимущество этого в том, что вы сможете делать такие вещи (как показано в вышеупомянутой статье):

interface IProcessor<in T>  
{  
    void Process(IEnumerable<T> ts);  
}

List<Giraffe> giraffes = new List<Giraffe> { new Giraffe() };  
List<Whale> whales = new List<Whale> { new Whale() };  
IProcessor<IAnimal> animalProc = new Processor<IAnimal>();  
IProcessor<Giraffe> giraffeProcessor = animalProc;  
IProcessor<Whale> whaleProcessor = animalProc;  
giraffeProcessor.Process(giraffes);  
whaleProcessor.Process(whales);  

Ответ 2

Это означает общую контравариантность. Противоположность - ковариация (ключевое слово out).

Это означает, что когда интерфейс является контравариантным (in), тогда интерфейс может быть неявно преобразован в общий тип, когда параметр типа наследует T.

И наоборот, для ковариации out интерфейс может быть неявно преобразован в общий тип, где параметр типа является "меньшим" типом в иерархии типов.