C# Lista av objekt som implementerar interfaces

Permalänk

C# Lista av objekt som implementerar interfaces

Hej alla!

Har en situation där jag behöver ta emot en lista med KeyValuePairs till min metod. Det jag sen ska göra är att visa upp det i en control.

Eftersom att alla klasser som jag vill visa inte är av typen KeyValuePair gjorde jag ett interface som enbart implementerar en konverteringsfunktion som returnerar en keyvaluepair.

Det jag sen gjorde var att jag hade en overload till funktionen SetSource(IList<KeyvaluePair> list) som tog emot en IEnumerable av mitt interface och som sen då skapar en ny lista med hjälp av en loop.

Har gått runt problemet nu men lite intresserad att se varför följande inte funkar:
Jag kan inte skicka in en List<klass som ärver från interfacet> till metoden, den säger att den itne kan konvertera listan av objekt till en enumerable av interfacet... Känns som att detta borde funka, är det något jag har tänkt fel?:S

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Se om jag förstått det rätt:

Du har alltså ett interface, säg att den heter IKp, sen har du en klass som använder interfacet, låt oss kalla den för Kp.

Du försöker alltså skicka in IEnumerable<Kp> i en funktion som tar IEnumerable<IKp>?

Det går inte, som du har märkt. För .net anser att IEnumerable<Kp> != IEnumerable<IKp> av någon konstig anledning.

Du har inte tänkt fel, iaf enligt mig och mina kolleger. Har själv undrat många gånger varför de inte har fixat det här. Men om jag inte missminner mig så är det fixat i .net 4.0.

Permalänk
Citat:

Ursprungligen inskrivet av thrawn
Se om jag förstått det rätt:

Du har alltså ett interface, säg att den heter IKp, sen har du en klass som använder interfacet, låt oss kalla den för Kp.

Du försöker alltså skicka in IEnumerable<Kp> i en funktion som tar IEnumerable<IKp>?

Det går inte, som du har märkt. För .net anser att IEnumerable<Kp> != IEnumerable<IKp> av någon konstig anledning.

Du har inte tänkt fel, iaf enligt mig och mina kolleger. Har själv undrat många gånger varför de inte har fixat det här. Men om jag inte missminner mig så är det fixat i .net 4.0.

Jo precis så! Tyckte att det var sjukt konstigt att en funktion som kan tar IKp som parameter kan ta Kp som parameter men inte om den är i en lista :/ Skönt att det inte bara var jag som tänkte konstigt, tyckte jag hade löst det rätt snyggt i övrigt men så blev jag lite konfunderad när det inte funkade :/

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av thrawn
Det går inte, som du har märkt. För .net anser att IEnumerable<Kp> != IEnumerable<IKp> av någon konstig anledning.

Anledningen är nog liknande vad jag hört om Java. Skulle man kunna skicka en IEnumerable<Kp> i sammanhanget skulle även följande gå:

public void AppendNewKp(IList<IKp> kps) { // Makes sense, då kps håller godtyckliga IKp-implementationer. kps.Add(new Kp2()); } IList<Kp> kps = new List<Kp>(); AppendNewKp(kps);

En Kp2 läggs till i en List<Kp>. Viss typsäkerhet försvinner, då dessa typfel inte skulle upptäckas förrän körning.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Citat:

Ursprungligen inskrivet av lajnold
Anledningen är nog liknande vad jag hört om Java. Skulle man kunna skicka en IEnumerable<Kp> i sammanhanget skulle även följande gå:

public void AppendNewKp(IList<IKp> kps) { // Makes sense, då kps håller godtyckliga IKp-implementationer. kps.Add(new Kp2()); } IList<Kp> kps = new List<Kp>(); AppendNewKp(kps);

En Kp2 läggs till i en List<Kp>. Viss typsäkerhet försvinner, då dessa typfel inte skulle upptäckas förrän körning.

Makes sense :/ Så man skulle alltså vara tvungen att skriva:

public void AppendNewKp(IList<IKp> kps) { // Makes sense, då kps håller godtyckliga IKp-implementationer. kps.Add(new Kp2()); } IList<IKp> kps = new List<IKp>(); kps.Add(new Kp()); AppendNewKp(kps);

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase