Ответ 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);