Вы можете прочитать об общей дисперсии и контравариантности, представленной в .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 интерфейс может быть неявно преобразован в общий тип, где параметр типа является "меньшим" типом в иерархии типов.