PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#: new dictionary und Add()


Elemental
2012-10-09, 12:05:29
Hallo zusammen,
weiss jemand, wieso folgende Zeile Code nicht kompiliert:

Dictionary<int, int> test = new Dictionary<int, int>().Add(3, 4);


Da kriegt man die Fehlermeldung
Cannot implicitly convert type 'void' to 'System.Collections.Generic.Dictionary<int,int>'

In zwei Zeilen funktioniert es natürlich

Dictionary<int, int> test = new Dictionary<int, int>();
test.Add(3, 4);


Aber wieso kann ich das nicht in einer Zeile machen?

mfG
Elemental

Baalzamon
2012-10-09, 12:07:34
Aber wieso kann ich das nicht in einer Zeile machen?

Ohne C# zu kennen, du versuchst den Rückgabewert der Add Methode an ein Dictionary Objekt zuzuweisen.

RLZ
2012-10-09, 12:08:22
Klammer den Ausdruck mal. Dann solltest du es sehen.

Elemental
2012-10-09, 12:10:55
Dictionary<int, int> test = (new Dictionary<int, int>()).Add(1,2);

bringt den gleichen Fehler.

edit, OK, gecheckt:
Es wird versucht der Variablen "test" den Rückgabewert von Add() zuzuweisen.

Baalzamon
2012-10-09, 12:12:21
Dictionary<int, int> test = (new Dictionary<int, int>()).Add(1,2);

bringt den gleichen Fehler.

Kein Wunder, denn
du versuchst den Rückgabewert der Add Methode an ein Dictionary Objekt zuzuweisen.

Das kann nicht funktionieren.

Du erzeugst ein Dictionary Objekt und rufst davon dann die Methode Add auf. Diese Methode hat (so nehme ich an) einen Void Rückgabewert. Und genau dieser Rückgabewert wird dann test zugewiesen.

Elemental
2012-10-09, 12:19:14
Danke für die Erklärungen! :)

PatkIllA
2012-10-09, 20:43:23
Du kannst es so schreiben:
var test = new Dictionary<int, int>() { { 1, 2 }, { 3, 4 } };
Das fügt durch ein bisschen Compilermagic zwei Einträge direkt hinzu.

Bekannter dürfte das mit Listen sein:
var list = new List<int> { 1, 2, 3, 4 };

robobimbo
2012-10-09, 20:43:32
aber das geht:


var test = new Dictionary<int, int>() { {3,4} };


Siehe auch: http://msdn.microsoft.com/en-us/library/bb531208.aspx

PatkIllA
2012-10-09, 20:54:58
Nach 8h nix kommt es zu 9 Sekunden Überschneidung. ;)

Das kann man auch in eigenen Klassen nutzen, die IEnumerable implementieren und eine Add Methode haben.


class Foo : IEnumerable
{
public void Add(int bar, string str, double blub)
{
...
}

#region IEnumerable Members

IEnumerator IEnumerable.GetEnumerator()
{
...
}

#endregion
}
var foo = new Foo() { { 3, "bar", 4.0 } };

DocEW
2012-10-09, 22:08:04
Das kann man auch in eigenen Klassen nutzen, die IEnumerable implementieren und eine Add Methode haben.
Oh cool, das wusste ich gar nicht, danke für den Hinweis! :)