2009-10-07 7 views
0
string categoryIDList = Convert.ToString(reader["categoryIDList"]); 

    if (!String.IsNullOrEmpty(categoryIDList)) 
    { 
     c.CategoryIDList = 
      new List<int>().AddRange(
       categoryIDList 
        .Split(',') 
        .Select(s => Convert.ToInt32(s))); 

    } 

La classe possède une propriété IList CategoryIDList que j'essaie d'attribuer à ci-dessus.Impossible de convertir implicitement le type void en IList <int>

Erreur:

Erreur 1 Impossible de convertir implicitement le type 'vide' à 'System.Collections.Generic.IList'

Je ne sais pas quel est le problème?

Répondre

0

Vous affectez le résultat de AddRange à c.CategoryIDList, pas la nouvelle liste elle-même.

5

Votre problème est que le AddRange method of the generic List class est déclaré comme étant retourné vide.

Mise à jour: Édité pour corriger List<int> par rapport au problème IList<int>.

Vous devez changer pour:

List<int> foo = new List<int>(); 
foo.AddRange(
    categoryIDList 
    .Split(',') 
    .Select(s => Convert.ToInt32(s))); 
c.CategoryIDList = foo; 
+1

Arghh, IList ne supporte pas AddRange bien? c.CategoryIDList est de type IList mrblah

+0

Oui, cela ne compilera pas tel quel. –

+0

@homestead & Reed Copsey: Oui, désolé pour ça. Une solution simple est juste d'utiliser une variable temporaire de type 'Liste '. Voir ma modification pour une solution possible. –

3

Pourquoi ne pas initialiser la liste des résultats de votre requête de sélection au lieu de faire AddRange car il faut IEnumerable comme une surcharge:

c.CategoryIDList = new List<int>(categoryIDList.Split(',') 
.Select(s => Convert.ToInt32(s))); 
2

AddRange ne renvoie pas de liste - il renvoie void. Vous pouvez le faire via le constructeur pour List<T>that takes an enumerable:

string categoryIDList = Convert.ToString(reader["categoryIDList"]); 

if (!String.IsNullOrEmpty(categoryIDList)) 
{ 
    c.CategoryIDList = 
     new List<int>(
      categoryIDList.Split(',').Select(s => Convert.ToInt32(s)) 
     ); 
} 
1

Pour avoir une meilleure compréhension de ce qui se passe, j'ai créé exemple ci-dessous. La solution doit être basée sur 1. list.AddRange, 2. liste réaffectant puis à autre chose:

List<int> list1 = new List<int>{1,4, 8}; 
List<int> list2 = new List<int> { 9, 3, 1 }; 
//this will cause compiler error "AddRange cannot convert source type void to target type List<>" 
//List<int> list3 = list1.AddRange(list2); 
//do something like this: 
List<int> list3 = new List<int>(); 
list3.AddRange(list1); 
list3.AddRange(list2); 
Questions connexes