-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
60 lines (41 loc) · 1.46 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
namespace Yet_another_explanation_of_variance
{
class Base { }
class Derived : Base { }
delegate TOutput InvariantFunc<TOutput>();
delegate void InvariantAction<TInput>(TInput input);
class Program
{
Derived ReturnDerived() { return new Derived(); }
void InputBase(Base input) { }
void LegalInvariance()
{
InvariantFunc<Base> notCovariance = ReturnDerived;
Base aBaseClassInstance = notCovariance();
InvariantAction<Derived> notContravariance = InputBase;
notContravariance(new Derived());
}
void IllegalInvariance()
{
InvariantFunc<Derived> returnDerived = ReturnDerived;
// illegal:
InvariantFunc<Base> needsCovariance = returnDerived;
InvariantAction<Base> inputBase = InputBase;
// illegal:
InvariantAction<Derived> needsContravariance = inputBase;
}
void CovarianceAndContravariance()
{
Func<Derived> returnDerived = ReturnDerived;
// legal because TOutput in Func<TOutput> is covariant
Func<Base> usesCovariance = returnDerived;
Action<Base> inputBase = InputBase;
// legal because TInput in Action<TInput> is contravariant
Action<Derived> usesContravariance = inputBase;
}
static void Main(string[] args)
{
}
}
}