Tipps und Tricks rund um .NET und Visual Studio

Sprachsyntax C Covarianz
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

Seit C# 4.0 können Typparameter mit dem Schlüsselwort out versehen werden. Das führt dazu, dass sie lediglich für Rückgabewerte und out-Parameter herangezogen werden dürfen. Aber warum sollte das Sinn machen? Die folgenden Zeilen bieten eine Antwort auf diese Frage. In Listing 3 wird eine Klasse Tier sowie die Klassen Hamster und Krokodil, die von Tier erben, deklariert. In der Methode CoVarianz werden zwei Hamster instanziiert und an die Methode Fotographiere übergeben. Diese Methode erwartet zwar „lediglich“ ein Tier, da Hamster jedoch von Tier erbt, kann es auch als solches verwendet werden. Anschließend wird ein IEnumerable erzeugt, das einem IEnumerable zugewiesen wird. Letzteres wird anschließend an die Methode Gruppenfoto übergeben.

Listing 1

class Tier { public String Name { get; set; } }
class Hamster : Tier { public void LaufeImRad() { } }
class Krokodil : Tier { public void boeseSein() { } }
    [...]

private static void CoVarianz()
{
Hamster h1 = new Hamster() { Name = "Krümel" };
Hamster h2 = new Hamster() { Name = "Goldy" };

Fotographiere(h1);
Fotographiere(h2);

IEnumerable kaefig = new List() { h1, h2 };
IEnumerable tiere = kaefig;
GruppenFoto(tiere);
}

private static void Fotographiere(Tier t)
{
Console.WriteLine("Fotographiere " + t.Name);
}

private static void GruppenFoto(IEnumerable tiere)
{
foreach (var t in tiere)
    {
Console.WriteLine("Fotographiere " + t.Name);
    }
}  

Da ein Hamster in diesem Beispiel als Tier verwendet werden kann, erscheint es auf dem ersten Blick auch logisch, dass eine Menge von Hamstern (zum Beispiel ein IEnumerable) als eine Menge von Tieren (zum Beispiel als IEnumerable) angesprochen werden kann. Bei einer genaueren Betrachtung fällt auf, dass dem nicht zwangsläufig so ist, denn das würde ja bedeuten, dass es möglich ist, zu einer Menge von Hamstern, die als Menge von Tieren angesprochen wird, ein Krokodil hinzuzufügen, da es sich dabei schließlich auch um ein Tier handelt. Da ein Krokodil jedoch kein Hamster ist, ist das im Sinne der Typsicherheit (sowie im Sinne der Sicherheit der betroffenen Hamster) nicht wünschenswert. Aus diesem Grund waren solche Zuweisungen vor C# 4.0 auch nicht erlaubt. Die Tatsache, dass bestimmte Klassen wie IEnumerable lediglich lesend auf die beinhalteten Instanzen zugreifen und die zuvor geäußerten Bedenken somit gegenstandslos sind, wurde dabei ignoriert.

C# 4.0 berücksichtigt nun diesen Umstand, indem mit dem Schlüsselwort out für Typparameter in Delegates und Interfaces festgelegt werden kann, dass sie lediglich als Rückgabewert und nicht als Übergabeparameter verwendet werden dürfen. Die integrierten Typen IEnumarable und IEnumartor machen davon bereits Gebrauch. Das ist auch der Grund dafür, dass Listing 4 mit C# 4.0 funktioniert. Es zeigt die Verwendung dieses neuen Schlüsselworts anhand der Deklaration der Interfaces IEnumerable und IEnumerator in .NET 4.0.

Listing 2

public interface IEnumerable : IEnumerable
{
IEnumerator GetEnumerator();
}
public interface IEnumerator : IEnumerator
{
bool MoveNext();
T Current { get; }
}  

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer arbeiten bei www.IT-Visions.de als Softwarearchitekten, Berater und Trainer für .NET-Technologien. Dabei unterstützen sie zahlreiche Unternehmen beim Einsatz von .NET und entwickeln selbst in größeren Projekten. Sie haben zahlreiche Fachbücher geschrieben und gehören seit vielen Jahren zu den Hauptsprechern auf der BASTA!. Manfred Steyer ist zudem für den Fachbereich „Software Engineering“ der Studienrichtung „IT und Wirtschaftsinformatik“ an der FH CAMPUS 02 in Graz verantwortlich. Dr. Holger Schwichtenberg unterrichtet in Lehraufträgen an den Fachhochschulen Münster und Graz.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -