code:
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
| delegate void MethodDelegate(Inherited param);
class BaseType
{
//Method 1.
public void Method(Inherited param)
{}
}
class Inherited : BaseType
{
//Method 2.
public void Method(object param)
{}
}
class Test
{
private static void Test()
{
Inherited inherited = new Inherited();
MethodDelegate dlgt = new
MethodDelegate(inherited.Method);
dlgt(inherited); //(hier stond null)
}
} |
Wanneer ik de bovenstaande code compileer in 1.1 wordt (zoals verwacht) bij het aanroepen van Test() keurig method 1 op BaseType aangeroepen.
Wanneer ik compileer in 2.0 wordt de method 2 op Inherited aangeroepen.
Dat is blijkbaar een bekend verschil tussen 1.1. en 2.0.
De uitleg over het gedrag:
http://www.gotdotnet.com/...2.0/default.aspx#00000085
De uitleg over co en contra variance:
http://msdn2.microsoft.com/en-us/library/ms173174.aspx
De compiler waarschuwing:
http://msdn2.microsoft.com/en-us/library/zfd7f9sw.aspx
Allemaal leuk, maar ik kom er niet achter waarom nou voor de minder specifieke method wordt gekozen in plaats van de keurig aanwezige specifieke method.
Wat zijn de regels waarop deze beslissing wordt gedaan door de compiler?
[ Voor 1% gewijzigd door LoekD op 29-09-2006 15:16 . Reden: N.a.v. antwoord 1; Parameter object type heeft geen invloed op de compiler. ]
Hoe meer je drinkt, hoe korter je leeft, hoe minder je drinkt