Ich versuche, über eine DataTable zu iterieren und die Werte von einer bestimmten Spalte zu erhalten. Bisher habe ich nur das Skelett der for-Schleife.
%Vor% Dies funktioniert nicht so, wie ich es erwartet habe. Ich erhalte einen Compiler-Fehler, wenn ich row[0]
mit der folgenden Meldung ausführen möchte: "Die Indizierung mit [] kann nicht auf einen Ausdruck vom Typ Object angewendet werden". Aber row
sollte kein Objekt sein, es ist ein DataRow
.
Um das zu beheben, habe ich die foreach-Schleife wie folgt geändert:
%Vor% Warum ist das notwendig? Warum kann C # nicht den Typ von row
ableiten, wie wenn ich beispielsweise versuchen würde, über string[]
zu iterieren?
Warum kann C # nicht den Typ der Zeile ableiten, wie wenn ich beispielsweise versuchen würde, über einen String [] zu iterieren?
TL; DR: DataTable
ist älter als Generika: (
DataTable.Rows
wird deklariert, um DataRowCollection
, die von InternalDataCollectionBase
abgeleitet ist . Dies implementiert die nicht generische ICollection
-Schnittstelle, was bedeutet, dass der Compiler den Typ von row
nicht nur von object
ableiten kann.
Dies ist nicht spezifisch für DataTable
- immer wenn Sie etwas haben, das nur IEnumerable
anstatt IEnumerable<T>
implementiert (und keine spezifischere GetEnumerator
-Methode für den Compiler hat), die Der abgeleitete Iterationselementtyp ist nur object
. Wenn Sie einen expliziten Typ für die Variable in der Schleife foreach
angeben, fügt der Compiler automatisch eine Umwandlung für Sie ein.
Ich würde die Änderung genau so beibehalten, wie Sie sie haben, aber eine Alternative wäre die Verwendung der Methode Cast
LINQ:
Die Eigenschaft Rows
von DataTable
ist ein Objekt vom Typ DataRowCollection
.
DataRowCollection
selbst erbt von InternalDataCollectionBase
, das ICollection
und IEnumerable
implementiert.
Der in diesen Auflistungen enthaltene Datentyp ist nicht weiter spezifiziert als Object
und kann daher nicht auf die Klasse DataRow
zurückgeführt werden.
Siehe hier als Referenz.