mdk.fr/content/blog/covariance-and-contravarian...

64 lines
1.9 KiB
Markdown
Raw Normal View History

2017-04-04 21:11:23 +00:00
Title: Covariance and Contravariance in C#3
A short introduction to Covariance and Contravariance in *C# 3* preparing
you to an article about that in *C# 4*. So what is covariance?
Covariance is basically using a method which returns something derived
from the expected type. An exemple? It's safe to have a method
returning a cat when you expect it to return an animal. In C sharp it's
:::csharp
public class Animal
{
}
public class Cat : Animal
{
}
public class Dog : Animal
{
}
// It's safe to say that something returns a Animal when in fact this thing returns a Cat
class Covariance
{
void test()
{
Func a = Method; // OK
Func b = delegate { return new Cat(); }; // OK
Func c = () => new Cat(); // OK
}
Cat Method()
{
return new Cat();
}
}
So Funcs `a`, `b`, and `c` are returning animals which in fact are
cats, which is true. And, what is contravariance? Contravariance is
basically using a method which takes something which is a parent of
the expected type. An exemple? It's safe to give a method an animal
when it expects to receive a cat.
:::csharp
// It's safe to say that something can take a Cat if in fact this thing can take any Animal
class Contravariance
{
static void test()
{
Action a = Method; // OK
Action b = delegate(Animal value) { }; // ERROR
// From C#3 Specification :
// $7.14.1 Anonymous function signatures :
// [...] contra-variance of anonymous function parameter types is not supported.
Action d = (Animal value) => { }; // idem... anonymous... not supported.
}
public static void Method(Animal value)
{
}
}
So `Action` `a` take `Cats`, but in fact can take any `Animals`, so it's safe.