In the interests of making code as usable as possible, interfaces and delegates with generic parameters should use the ``++out++`` and ``++in++`` modifiers when possible to make the interfaces and delegates covariant and contravariant, respectively. The ``++out++`` keyword can be used when the type parameter is used only as a return type in the interface or delegate. Doing so makes the parameter covariant, and allows interface and delegate instances created with a sub-type to be used as instances created with a base type. The most notable example of this is ``++IEnumerable++``, which allows the assignment of an ``++IEnumerable++`` instance to an ``++IEnumerable++`` variable, for instance. The ``++in++`` keyword can be used when the type parameter is used only as a method parameter in the interface or a parameter in the delegate. Doing so makes the parameter contravariant, and allows interface and delegate instances created with a base type to be used as instances created with a sub-type. I.e. this is the inversion of covariance. The most notable example of this is the ``++Action++`` delegate, which allows the assignment of an ``++Action++`` instance to a ``++Action++`` variable, for instance. == Noncompliant Code Example [source,csharp] ---- interface IConsumer // Noncompliant { bool Eat(T fruit); } ---- == Compliant Solution [source,csharp] ---- interface IConsumer { bool Eat(T fruit); } ---- ifdef::env-github,rspecator-view[] ''' == Implementation Specification (visible only on this page) include::message.adoc[] ''' == Comments And Links (visible only on this page) include::comments-and-links.adoc[] endif::env-github,rspecator-view[]