mdk.fr/content/blog/covariance-and-contravariance-in-c-sharp-3.md
2017-04-04 23:11:23 +02:00

68 lines
1.9 KiB
Markdown

---
Title: Covariance and Contravariance in C#3
Date: 2009-03-09 21:19:51
---
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.