In C++ ist folgendes möglich:
++i = ++i + ++i;
Was würde die Console für i anzeigen?
int i=0;
++i = ++i + ++i;
cout<<"i = "<<i;
Bei mir wurde der Wert 6 angezeigt, erst wurde i dreimal inkrementiert, dann wurde 3 + 3 addiert.
Im C++ -Forum wurde das als Undefined Behavior eingestuft und mir als UB-Test empfohlen:
int i=0, a, b, c;
a = ++i = (b=++i) + (c=++i);
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
cout<<"i = "<<i<<endl;
Hallo,
warum klappt Folgendes nicht:
Task[] tasks = new Task[] {
()=>{object1.run;},
()=>{object2.run;},
()=>{object3.run;},
()=>{object4.run;}
};
Es kommt dann die Fehlermeldung, dass ein Lambda kein Delegat sei.
Wenn ich es einzeln machen würde mit Task t=new Task(()=>{...};), klappt es ja normal. Warum nicht bei einem Array wie oben? Es wird doch normal pro Element der Konstruktor Task (Action Action) aufgerufen oder läuft es bei einer Array-Initialisierung anders?
Nach Lektüre der Microsoftl-lib sehe ich als Lösung:
List<Task> tasks = new List<Task>();
foreach(){Task t = new Task( () => {...});}
Es müsste aber auch mit Array wie oben vorgestellt gehen?
Würde das funktionieren?
Task[] tasks = new Task[] {
delegate{object1.run;},
delegate{object2.run;},
delegate{object3.run;},
delegate{object4.run;}
};
Aber warum funktioniert dann nicht die Schreibweise mit ()=>? Ich habe C#10
@chilic, @pinki: Habe ich verstanden, besten Dank!
In einem Lehrbuch wurde Hashtable.ContainsValue (System.Collections) und ein Beispiel hierzu vorgestellt, welches bei mir nicht funktioniert hat (VS C# 2010). Das inhaltsgleiche, mit new neu erstellte Element (welches nicht Bestandteil der Hashtable ist) wurde trotz Inhaltsgleichheit nicht gefunden.
Meine Hash-Tabelle:
Hashtable hash = new Hashtable();
Gegenstand gegenstand1 = new Gegenstand(101, "Basispreis", 2.33);
Gegenstand gegenstand2 = new Gegenstand(45, "Volitilät", 0.31);
Gegenstand gegenstand3 = new Gegenstand(45, "Marktwert", 3.41);
Gegenstand gegenstand4 = new Gegenstand(6, "Ausübungstermin", 5.12);
Gegenstand gegenstand5 = new Gegenstand(22, "Zinssatz", 1.03);
Diese Gegenstände werden über hash.Add eingefügt.
Hier die zwei Suchfunktionen:
public static void Wertsuche(Hashtable hash, Gegenstand gegenstand)
{
if (hash.ContainsValue(gegenstand)) Console.WriteLine("enthalten"); else Console.WriteLine("nicht enthalten.");
}
public static void Wertsuche2(Hashtable hash, Gegenstand gegenstand)
{
bool gefunden=false;
foreach (Gegenstand item in hash.Values) if (item == gegenstand) gefunden = true;
if (gefunden) Console.WriteLine("enthalten"); else Console.WriteLine("nicht enthalten");
}
Wenn ich nun einen vorhandenen Gegenstand suche, wird er klar von beiden Suchfunktionen gefunden:
Wertsuche(hash, gegenstand3); // --> "enthalten"
Wertsuche2(hash, gegenstand3); // --> "enthalten"
Nicht aber, wenn ich einen inhaltsgleichen neuen Gegenstand erstelle:
Wertsuche(hash, new Gegenstand(45, "Marktwert", 3.41)); // --> "nicht enthalten"
Wertsuche2(hash, new Gegenstand(45, "Marktwert", 3.41)); // --> "nicht enthalten"
Ich vermute daher, dass über Contains.Value und über Hashtable.value == Gegenstand nicht die Inhalte der Variablen abgeglichen werden, sondern ob beide Variablen dieselbe Adresse haben. Liege ich richtig oder ich habe einfach etwas völlig falsch verstanden?
Also Frage bitte: Was wird verglichen in den beiden obigen Suchfunktionen: Der Inhalt der Variablen oder deren Adressen? Wenn Inhalt - warum funktioniert dann der Abgleich der über new neu instanzierten inhaltsgleichen Gegenstände nicht?