Co myslíte, že je v Member v jednotlivých případech?
class BaseClass<T> { public static string Member; } class DerivedClass1 : BaseClass<int> { } class DerivedClass2 : BaseClass<double> { } class DerivedClass3 : BaseClass<int> { } void Main() { DerivedClass1.Member = "test"; Console.WriteLine(DerivedClass1.Member); Console.WriteLine(DerivedClass2.Member); Console.WriteLine(DerivedClass3.Member); }
Sorry, z první verze hádanky mi Writer vyházel generičnost tříd, teď je to snad správně.
To se mi líbíTo se mi líbí
Co se týče příkladu tak tam bude „test“ ale co se týče generického typu, tak by v DerivedClass1 a odvozených typech se stejným generickým typem byl „test“ a v ostatnich null.
To se mi líbíTo se mi líbí
„test“
„test“
To se mi líbíTo se mi líbí
1: „test“
2: string.Empty
3: „test“
To se mi líbíTo se mi líbí
No spustit to v dotnetfiddle umím taky :)
Otázka je spíš proč tomu tak je – podle mne kompilátor rozdělí „nestejné“ třídy a každá má svoje statické proměnné, stejné (nebo klasicky zděděné) třídy naopak statické proměnné logicky sdílí. Původní negenerický příklad vypsal 3x test – protože všechny třídy sdílely jednu statickou proměnnou.
Spíchnul jsem demonstrativní příklad – všimněte si, že třídy 3 a 4 mají společné hodnoty.
Ten „generalizovaný“ member prostě nejde „špatně“ přiřadit – takže logicky musí mít každá různá třída jinou statickou proměnnou.
https://dotnetfiddle.net/gvgPvG
To se mi líbíTo se mi líbí
Proč tomu tak je, jsem už kdysi popsal zde:
http://www.dotnetportal.cz/blogy/15/Null-Reference-Exception/5221/Staticke-promenne-jsou-per-T
To se mi líbíTo se mi líbí
Generika a static je celkom zaujimavy topic, pre každý sa vytvorí osobitná statická inštancia v debug pri spusteni, v release pri prvom použití.
Čo je ale ešte zaujimavejšie, tak, že existuje typ BaseClass`1, teda niečo ako predok (to pre prípad ak potrebujete niekedy zistiť, či maju spoločného predka). No a napriek tomu, že takýto typ existuje, nie je možné ho nastaviť reflexiou, viď https://dotnetfiddle.net/9xgwAg.
Mimochodom aj keď to nevyzera dobre, tak veľa projektov to rieši BaseClass bez generík https://dotnetfiddle.net/yEgOf8 a do generic static fieldov davaju iba T type staticke fieldy.
To se mi líbíTo se mi líbí