У меня есть метод, который принимает объект params [], например:
void Foo(params object[] items)
{
Console.WriteLine(items[0]);
}
Когда я передаю этому методу два массива объектов, он отлично работает:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]
Но когда я передаю один объект [], он не принимает мой объект [] в качестве первого параметра, вместо этого он принимает все его элементы, как я хотел передать их один за другим:
Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]
Как передать один объект [] в качестве первого аргумента в массив params?
params
Модификатор параметра дает звонящему ярлык синтаксис для передачи несколько аргументов для метода. Есть два способа вызвать метод сparams
параметром:1) Вызов с массивом типа параметра, в этом случае
params
ключевое слово не действует, и массив передается непосредственно в метод:2) Или вызов с расширенным списком аргументов, и в этом случае компилятор автоматически обернет список аргументов во временный массив и передаст его методу:
Чтобы передать массив объектов методу с
params object[]
параметром " ", вы можете:1) Создайте массив-оболочку вручную и передайте его непосредственно методу, как указано в lassevk :
2) Или приведите аргумент к
object
, как упомянул Адам , и в этом случае компилятор создаст для вас массив-оболочку:Однако, если целью метода является обработка нескольких массивов объектов, может быть проще объявить его с явным "
params object[][]
" параметром. Это позволит вам передать несколько массивов в качестве аргументов:Изменить: Раймонд Чен описывает это поведение и его связь со спецификацией C # в новом посте .
источник
Это однострочное решение, включающее LINQ.
источник
Вам нужно инкапсулировать его в другой массив object [], например:
источник
Другой способ решить эту проблему (это не очень хорошая практика, но выглядит красиво):
Использование:
источник
Один из вариантов - вы можете обернуть его в другой массив:
Это некрасиво, но поскольку каждый элемент представляет собой массив, вы не можете просто использовать его, чтобы проблема исчезла ... например, если бы это был Foo (элементы объекта params), тогда вы могли бы просто сделать:
В качестве альтернативы вы можете попробовать определить другой перегруженный экземпляр Foo, который принимает только один массив:
источник
источник