64 lines
1.9 KiB
Markdown
64 lines
1.9 KiB
Markdown
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.
|