What does an "in" generic parameter do?

C#Generics

C# Problem Overview


Saw this signature today:

public interface ISomeInterface<in T>

What impact does the in parameter have?

C# Solutions


Solution 1 - C#

You could read about generic variance and contravariance introduced in .NET 4.0. The impact that the in keyword has on the interface is that it declares it as contravariant meaning that T can only be used as input method type. You cannot use it as return type on the methods of this interface. The benefit of this is that you will be able to do things like this (as shown in the aforementioned article):

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);  

Solution 2 - C#

That signifies generic contravariance. The opposite is covariance (keyword out).

What this means is that when an interface is contravariant (in), then the interface can be implicitly converted to a generic type when the type parameter inherits T.

Conversely for covariance out, the interface can be implicitly converted to a generic type where the type parameter is a 'lesser' type in the type hierarchy.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBen FosterView Question on Stackoverflow
Solution 1 - C#Darin DimitrovView Answer on Stackoverflow
Solution 2 - C#driisView Answer on Stackoverflow