Warum kann C # den Typ einer DataTable-Zeile nicht ableiten [duplizieren]

8

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?

    
Michael Hancock 08.02.2018, 10:03
quelle

3 Antworten

16
  

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:

%Vor%     
Jon Skeet 08.02.2018, 10:08
quelle
9

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.

    
Adwaenyth 08.02.2018 10:08
quelle
-3

Grund dafür ist Zeilen ist DataRowCollection das ist IEnumerable anstelle von IEnumerable<T> , wobei T DataRow ist.

    
shrot 08.02.2018 10:12
quelle

Tags und Links