PDA

View Full Version : c# problema delegate


millennio
09-05-2011, 10:23
private delegate void SelectListBoxItemDelegate(object item);

private void SelectListBoxItem(object item)
{
if (this.listBox2.InvokeRequired)
{
// This is a worker thread so delegate the task.
this.listBox2.Invoke(new SelectListBoxItemDelegate(this.SelectListBoxItem), item);
}
else
{
// This is the UI thread so perform the task.
Console.WriteLine(this.listBox2.Items[(item)].ToString());
}
}

quando compilo mi scrive questi errori:
Errore 2 La corrispondenza migliore del metodo di overload per 'System.Windows.Forms.ListBox.ObjectCollection.this[int]' presenta alcuni argomenti non validi

e

Errore 3 Argomento 1: impossibile convertire da 'object' a 'int'

^TiGeRShArK^
09-05-2011, 22:21
gli int in c# non sono object, sono struct e this.SelectListBoxItem mi sa che e' un int.

DioBrando
12-05-2011, 12:11
gli int in c# non sono object, sono struct e this.SelectListBoxItem mi sa che e' un int.

non č Python :D


ma...cosa vorresti fare perdonami?

digitalsound
26-05-2011, 16:37
gli int in c# non sono object, sono struct e this.SelectListBoxItem mi sa che e' un int.

Gli int in C# sono value types, struct e derivano implicitamente da System.ValueType, sono quindi anche dei System.Object.

Kralizek
26-05-2011, 17:49
Gli int in C# sono value types, struct e derivano implicitamente da System.ValueType, sono quindi anche dei System.Object.

gli int sono value types, come tutte le struct ed infatti stanno nello stack del metodo o nel corpo dell'oggetto che li contiene.

Che siano passabili attraverso boxing ad un metodo che accetta object non significa nulla.

Per il topic:

Console.WriteLine(this.listBox2.Items[(int)item].ToString());


dovrebbe andare bene

digitalsound
27-05-2011, 08:57
Se stai usando .NET Framework dal 3.0 in su almeno, ti consiglio di non dichiarare un nuovo delegate a meno che non sia strettamente necessario.
Ti consiglio invece di usare i delegate generici:

Action<int> SelectionAction = (selItem) => {};

oppure

private delegate void SelectListBoxItemDelegate(object item);

potevi dichiararlo cosė

private delegate void SelectListBoxItemDelegate(int item);

e non avresti avuto bisogno di fare il cast esplicito.