2016-11-24 5 views
0

Ich habe eine Methode ExecuteQuery und es wird ein Datatable Objekt zurückgegeben, das ein Verfahren zum Objekt ist _dataAccess, wird dies mit, um ein richtige kompilieren System.Datavar Schlüsselwort und mit Namensraum

string query = "select * from UserNeeds where userNeedID =" + item.ParentId; 
var result = _dataAccess.ExecuteQuery(query, CommandType.Select); 
foreach (var rows in result.Rows) 
{ 

} 

verwenden, aber wenn i var geändert und wenn geben Sie Orginal Typ Datatable es wird comiple Zeit Fehler zeigen, wie wir System.Data verpasst haben.

Meine Frage ist, wie der Compiler verstehen kann, dass System.Data der Namensraum ist, wenn wir var als Typ behalten.

oder warum es zwingt, wenn wir orginal datatype anstelle von var verwenden, wie Compiler das gleiche übergibt?

+0

basicaly var ist ein anonymer Typ, den Sie mehr darüber lesen können [hier] (https://msdn.microsoft.com/en-us/library/bb397696.aspx) –

+0

@ m.rogalski: ['var'] (https://msdn.microsoft.com/en-us/library/bb383973.aspx) ist kein anonymer Typ, es ist nicht einmal damit verbunden. Das Schlüsselwort 'var' ist genau wie ein Platzhalter für den tatsächlichen Typ dieser Variablen. Sie brauchen also nicht zu schreiben: Dictionary >> dict = new Dictionary >>(); 'aber Sie kann 'var dict = new Dictionary >>()' verwenden –

Antwort

2

var ist kein Typ für sich, es ist ein Platzhalter für den tatsächlichen Typ, der vom Compiler aufgelöst wird. Da DataRowCollection (von DataRable.Rows zurückgegeben) nicht implementieren IEnumerable<DataRow>, aber nur die nicht-generische IEnumerable Schnittstelle die foreach Objekt rows ist vom Typ Object. Sie können DataRow Eigenschaften und Methoden in der Schleife nicht verwenden.

Sie müssen es jedes Mal werfen oder lassen Sie es von der foreach gegossen werden:

foreach (DataRow row in result.Rows) 
{ 

} 

Jetzt Sie using System.Data zum Anfang der Datei oder

foreach (System.Data.DataRow row in result.Rows) 
{ 

} 

Also der Grund verwenden hinzufügen müssen Warum kompiliert es mit var ohne das Hinzufügen des Namespace ist, dass der Compiler System.Object für var verwendet, da DataRowCollection Objekte nicht DataRows liefert.

0

Namespace ist eine kurze Notation eines beliebigen Objekts. Wenn Sie nicht angeben, müssen Sie den vollständigen Objektnamen angeben.

Var ist ein einmaliger dynamischer Datentyp, der die Objekttypen speichert, sobald sie dynamisch mit dem vollständigen Objektnamen erstellt wurden.

Verwandte Themen