Как передать один объект [] объекту params []

У меня есть метод, который принимает params 9X_c-sharp object[], например:

void Foo(params object[] items) { Console.WriteLine(items[0]); } 

Когда я передаю этому 9X_c#-language методу два массива объектов, он работает 9X_csharp нормально:

Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } ); // Output: System.Object[] 

Но когда я передаю один объект 9X_c# [], он не берет мой объект [] в качестве 9X_static-array первого параметра, вместо этого он берет 9X_array все его элементы, как я хотел передать их 9X_c#-language один за другим:

Foo(new object[]{ (object)"1", (object)"2" }); // Output: 1, expected: System.Object[] 

Как передать одиночный объект 9X_jsonarray [] в качестве первого аргумента в массив 9X_javascript-array params?

127
0
7
Общее количество ответов: 7

Ответ #1

Ответ на вопрос: Как передать один объект [] объекту params []

Простое приведение типов гарантирует, что 9X_csharp компилятор знает, что вы имеете в виду в 9X_c# данном случае.

Foo((object)new object[]{ (object)"1", (object)"2" })); 

Поскольку массив является 9X_javascript-array подтипом объекта, все работает. Хотя решение 9X_.cs-file странное, соглашусь.

103
2

  • Я понял, что не ясно дал понять, что я очень уважаю Андерса Хейлсберга, он о ...

Ответ #2

Ответ на вопрос: Как передать один объект [] объекту params []

Модификатор параметра params дает вызывающей стороне 9X_static-array сокращенный синтаксис для передачи нескольких 9X_bytearray аргументов в метод. Есть два способа вызвать 9X_array метод с параметром params:

1) Вызов с массивом типа 9X_static-array параметра, в этом случае ключевое слово 9X_javascript-array params не действует и массив передается напрямую 9X_arrays в метод:

object[] array = new[] { "1", "2" }; // Foo receives the 'array' argument directly. Foo( array ); 

2) Или вызов с расширенным списком 9X_bytearray аргументов, и в этом случае компилятор автоматически 9X_c# поместит список аргументов во временный 9X_bytearray массив и передаст его методу:

// Foo receives a temporary array containing the list of arguments. Foo( "1", "2" ); // This is equivalent to: object[] temp = new[] { "1", "2" ); Foo( temp ); 


Чтобы передать 9X_c#-language массив объектов в метод с параметром "params object[]", вы 9X_.cs-file можете:

1) Создайте массив-оболочку вручную 9X_c#-language и передайте его непосредственно методу, как 9X_csharp указано lassevk:

Foo( new object[] { array } ); // Equivalent to calling convention 1. 

2) Или приведите аргумент к object, как 9X_string-array указано в Adam, и в этом случае компилятор создаст 9X_arrays для вас массив-оболочку:

Foo( (object)array ); // Equivalent to calling convention 2. 


Однако, если целью 9X_jsonarray метода является обработка нескольких массивов 9X_c#-language объектов, может быть проще объявить его 9X_visual-c# с явным параметром "params object[][]". Это позволит 9X_string-array вам передавать несколько массивов в качестве 9X_c#.net аргументов:

void Foo( params object[][] arrays ) { foreach( object[] array in arrays ) { // process array } } ... Foo( new[] { "1", "2" }, new[] { "3", "4" } ); // Equivalent to: object[][] arrays = new[] { new[] { "1", "2" }, new[] { "3", "4" } }; Foo( arrays ); 

Изменить: Рэймонд Чен описывает это поведение 9X_character-arrays и его связь со спецификацией C# в a new post.

77
0

Ответ #3

Ответ на вопрос: Как передать один объект [] объекту params []

Это однострочное решение, включающее LINQ.

var elements = new String[] { "1", "2", "3" }; Foo(elements.Cast
   ().ToArray()) 

9X_bytearray

9
0

Ответ #4

Ответ на вопрос: Как передать один объект [] объекту params []

Вам нужно инкапсулировать его в другой массив 9X_c-sharp object[], например:

Foo(new Object[] { new object[]{ (object)"1", (object)"2" }}); 

3
0

Ответ #5

Ответ на вопрос: Как передать один объект [] объекту params []

Другой способ решить эту проблему (это не 9X_arrays очень хорошая практика, но выглядит красиво):

static class Helper { public static object AsSingleParam(this object[] arg) { return (object)arg; } } 

Использование:

f(new object[] { 1, 2, 3 }.AsSingleParam()); 

2
0

Ответ #6

Ответ на вопрос: Как передать один объект [] объекту params []

Один из вариантов — вы можете обернуть его 9X_c#-language в другой массив:

Foo(new object[]{ new object[]{ (object)"1", (object)"2" } }); 

Немного некрасиво, но поскольку 9X_bytearray каждый элемент представляет собой массив, вы 9X_c-sharp не можете просто привести его к типу, чтобы 9X_visual-c# решить проблему... например, если бы это 9X_csharp был Foo(элементы объекта params), тогда 9X_jsonarray вы могли бы просто сделать:

Foo((object) new object[]{ (object)"1", (object)"2" }); 

В качестве альтернативы 9X_c#.net вы можете попробовать определить другой 9X_arrays перегруженный экземпляр Foo, который принимает 9X_array только один массив:

void Foo(object[] item) { // Somehow don't duplicate Foo(object[]) and // Foo(params object[]) without making an infinite // recursive call... maybe something like // FooImpl(params object[] items) and then this // could invoke it via: // FooImpl(new object[] { item }); } 

1
0

Ответ #7

Ответ на вопрос: Как передать один объект [] объекту params []

new[] { (object) 0, (object) null, (object) false } 
9X_c-sharp
1
0