2009-11-18 2 views
2

Почему я получаю ошибку в следующем объявлении?C# Function Chaining

List<int> intrs = new List<int>().AddRange(new int[]{1,2,3,45}); 

Ошибка: Невозможно преобразовать тип void в список?

+9

Поскольку AddRange не возвращает список . –

ответ

16

Потому что функция AddRange не возвращает значение. Вы, возможно, потребуется выполнить в два этапа:

List<int> intrs = new List<int>(); 
intrs.AddRange(new int[]{1,2,3,45}); 
5

AddRange не возвращает список он добавляет объекты (в отличие от StringBuilder). Вам нужно сделать что-то вроде этого:

List<int> intrs = new List<int>(); 
intrs.AddRange(new int[]{1,2,3,45}); 
2

AddRange() объявлен как:

public void AddRange(object[]); 

Он не возвращает список.

6

Поскольку AddRange изменяет указанный список вместо того, чтобы возвращать новый список с добавленными элементами. Чтобы указать это, он возвращает void.

Попробуйте это:

List<int> intrs = new List<int>(); 
intrs.AddRange(new int[]{1,2,3,45}); 

Если вы хотите создать новый список, не изменяя первоначальный список, вы можете использовать LINQ:

List<int> intrs = new List<int>(); 
List<int> newIntrs = intrs.Union(new int[]{1,2,3,45}).ToList(); 
// intrs is unchanged 
7

Вы можете также использовать коллекцию инициализатор (в предположении, C# 3.0+).

List<int> intrs = new List<int> { 1, 2, 3, 45 }; 

Редактируйте 280Z28: Это работает для всего с Add методом. Скобка конструктора является необязательной - если вы хотите передать предмет конструктору, например, емкость, вы можете сделать это с помощью List<int>(capacity), а не только List<int>, написанного выше.

Вот ссылка MSDN для получения более подробной информации о Object and Collection Initializers.

Dictionary<string, string> map = new Dictionary<string, string>() 
    { 
     { "a", "first" }, 
     { "b", "second" } 
    }; 
+0

Да, я использую C# 3.0. Спасибо. – udana

+0

Но конструктор не объявлен ??? Это синтаксический сахар? – udana

+0

Это синтаксический сахар - см. Http://msdn.microsoft.com/en-us/library/bb384062.aspx – thecoop

1

Кстати в C# 3.x (не уверен, 2,0), вы можете сделать что-либо из

List<int> intrs = new List<int>{1,2,3,45}; 
List<int> intrs = new []{1,2,3,45}.ToList(); // with Linq extensions 

Помимо других ответов, вы можете добавить свой собственный метод расширения, который добавит диапазон и возврат список (а не то, что это хорошая практика).

0

Кстати, если вы уже объявили intrs, вы могли бы сделать это с помощью скобок:

(intrs = new List<int>()).AddRange(new int[] { 1, 2, 3, 45 }); 

Однако, мне нравится синтаксис инициализации лучше.

0

Хотя другие уже упоминали, что AddRange не возвращает значение, на основе выборок, заданных для альтернатив, следует также помнить, что конструктор List также принимает IEnumerable of T, а также ранее упомянутый код это .NET 3.5+

Например:

List<int> intrs = new List<int>(new int[]{2,3,5,7}); 
0

Существует еще один способ.

List<int> intrs = new List<int> 
         { 
          1, 
          2, 
          3, 
          45 
         }; 
+0

Да, я знаю, что это не было полностью связано с цепочкой методов. –

 Смежные вопросы

  • Нет связанных вопросов^_^