Note that there are some explanatory texts on larger screens.

plurals
  1. POImplementing Co and Contra variance generic interface & its practical uses
    primarykey
    data
    text
    <p>I am trying to understand the possible use of using a variant generic interface(using both co and contra variant). Can someone please explain? I understood co and contra variance examples for interfaces individually, </p> <p><strong>Co variance example</strong></p> <pre><code>public class Request { } public class Response { } public class SuperRequest : Request { } public class SuperResponse : Response { } public interface CoVarianceInterface&lt;out O&gt; { O Get(); } public class CoVarianceInterfaceInstance1 : CoVarianceInterface&lt;Response&gt; { public Response Get() { Console.WriteLine("Co Variance"); return null; } } public class CoVarianceInterfaceInstance2 : CoVarianceInterface&lt;SuperResponse&gt; { public SuperResponse Get() { Console.WriteLine("Co Variance 1"); return null; } } static void CallCoVarianceInterface(CoVarianceInterface&lt;Response&gt; task) { task.Get(); } static void Test() { CoVarianceInterface&lt;Response&gt; i1 = new CoVarianceInterfaceInstance1(); CoVarianceInterface&lt;SuperResponse&gt; i2 = new CoVarianceInterfaceInstance2(); CallCoVarianceInterface(i1); CallCoVarianceInterface(i2); **//Co variance here bcoz more derived to less derived type?** } </code></pre> <p><strong>Contra variance example</strong></p> <pre><code>public interface ContraVarianceInterface&lt;in O&gt; { void Set(O input); } public class ContraVarianceInterfaceInstance1 : ContraVarianceInterface&lt;Request&gt; { public void Set(Request input) { Console.WriteLine("Contra Variance"); } } public class ContraVarianceInterfaceInstance2 : ContraVarianceInterface&lt;SuperRequest&gt; { public void Set(SuperRequest input) { Console.WriteLine("Contra Variance 1"); } } static void CallContraVarianceInterface(ContraVarianceInterface&lt;SuperRequest&gt; task) { task.Set(null); } static void Test() { ContraVarianceInterface&lt;Request&gt; o1 = new ContraVarianceInterfaceInstance1(); ContraVarianceInterface&lt;SuperRequest&gt; o2 = new ContraVarianceInterfaceInstance2(); CallContraVarianceInterface(o1); **//Contra variance here bcoz less derived to more derived type?** CallContraVarianceInterface(o2); } </code></pre> <p><strong>Co/Contra variance</strong></p> <pre><code>public interface CoContraInterface&lt;out O, in I&gt; { O Execute(I input); } public class CoContraInterfaceInstance1 : CoContraInterface&lt;Response, Request&gt; { public Response Execute(Request input) { Console.WriteLine("Variance"); return new Response(); } } public class CoContraInterfaceInstance2 : CoContraInterface&lt;SuperResponse, SuperRequest&gt; { public SuperResponse Execute(SuperRequest input) { Console.WriteLine("Variance 1"); return new SuperResponse(); } } static void CallCoContraInterface(CoContraInterface&lt;Request, Response&gt; task) { task.Execute(null); } static void Test() { CoContraInterface&lt;Response, Request&gt; c1 = new CoContraInterfaceInstance1(); CoContraInterface&lt;SuperResponse, SuperRequest&gt; c2 = new CoContraInterfaceInstance2(); CoContraInterface&lt;Response, SuperRequest&gt; c3 = new CoContraInterfaceInstance1(); c3 = c1; **//here Request is typed to SuperRequest, so is it contra variance?** c3 = c2; **//here Request is typed to SuperRequest, so is it contra variance? also SuperResponse to Response, so is it Co variance as well?** CreateSample(c1); CreateSample(c2); CreateSample(c3); } is the above code right? if so where we can practically use an interface that have both Co and Contra variance? </code></pre> <p>Thanks</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload