2009-12-08 7 views
10

J'essaie de définir une propriété de mes contrôles .ascx à partir d'un .aspx en utilisant ce contrôle.Erreur: impossible de convertir implicitement le type 'void' en 'System.Collections.Generic.List'

Ainsi, dans l'un de mes .aspx qui a ce contrôle, j'ai le code suivant en essayant de définir la propriété ÉlémentsGroupe de mon embarqué .ascx:

Item item = GetItem(itemID); 
myUsercontrol.ItemList = new List<Item>().Add(item); 

La propriété dans le .ascx que je suis en train de mettre ressemble à ceci:

public List<Item> ItemsList 
{ 
    get { return this.itemsList; } 
    set { this.itemsList = value; } 
} 

erreur: ne peut pas convertir implicitement le type « vide » à « System.Collections.Generic.List »

Donc, je ne comprends pas où il devient vide dans le cadre de la propriété? ... bizarre.

Répondre

25

Vous ne pouvez pas faire cela parce que la fonction Add renvoie l'annulation, pas une référence à la liste. Vous pouvez le faire:

mycontrol.ItemList = new List<Item>(); 
mycontrol.ItemList.Add(item); 

ou utilisez un collection initializer:

mycontrol.ItemList = new List<Item> { item }; 
+0

J'ai eu une erreur de publication, lire le message mis à jour – PositiveGuy

+0

J'ai créé une nouvelle instance de la liste avec le nouveau mot-clé, pourquoi Add aurait quelque chose à faire avec la nouvelle instance que j'ai déjà spécifiée? J'ajoute juste du contenu au tableau de liste – PositiveGuy

+0

@cofffeeaddict: Vous essayez de définir une propriété qui attend une instance de la liste. La méthode 'Add' est vide. – shahkalpesh

1
ItemListt.ItemList = new List<Item>().Add(item); 

Est-ce que la méthode Add retour une instance d'une liste classe basée?

EDIT: Non, voir ce link la documentation sur List<T>.Add

EDIT2: Essayez d'écrire ce morceau de code & voir quelle est la valeur de retour de la méthode Add.

List<Item> items = new List<Item>(); 
var modifiedList = items.Add(myItem); 

Vous verrez que, le code devrait échouer à Add car elle retourne void.

+0

J'ai eu une erreur d'affichage, mise à jour après la lecture. – PositiveGuy

+0

@coffeeaddict: J'ai actualisé la page plusieurs fois. Mais je ne peux voir aucun changement dans le code. Le problème réside toujours avec votre utilisation de la méthode 'Add' qui renvoie un vide. Utilisez un initialiseur de collection à la place. 'new List () {item};' (J'espère que cette syntaxe est correcte). – shahkalpesh

+0

merci. Oui, je comprends maintenant. – PositiveGuy

1

Après avoir créé le List<Item> vous immédiatement appeler Ajouter à ce sujet, qui est une méthode de retour vide. Cela ne peut pas être converti en le type de ItemList.ItemList.

Vous devez le faire à la place:

var list = new List<Item>(); 
list.Add(item); 
ItemList.ItemList = list; 
0

Tant que ItemList est instancié sur votre usercontrol, vous pouvez juste faire UserControl.ItemList.Add(item)

+0

Pourquoi ItemList a besoin d'être instancié n'importe où mais où je l'ai déjà instancié. J'ai utilisé le nouveau mot-clé ici, c'est déjà une instance! – PositiveGuy

+0

correct, mais la méthode List .Add() a un type de retour void, donc vous ne pouvez pas lui assigner mycontrol.ItemList(). Vous devez soit l'inséparer séparément sur une autre ligne, soit utiliser un initialiseur de collection. Ma réponse s'applique si vous avez déjà effectué l'instanciation. –

0

La méthode Add ne renvoie pas une référence à la liste. Vous devez faire en deux étapes:

ItemListt.ItemList = new List<Item>(); 
ItemListt.ItemList.Add(item); 

Vous pouvez également utiliser une variable locale pour maintenir la référence avant de le mettre dans la propriété:

List<Item> list = new List<Item>(); 
list.Add(item); 
ItemListt.ItemList = list; 
1
new List<Item>().Add(item); 

Cette ligne retourne void.

Essayez:

var list = new List<Item>(); 
list.Add(item); 
ItemListt.ItemList = list; 
+0

Vous avez de la chance. cliqué plus1 par erreur. – aMazing

Questions connexes