Как передать один объект [] объекту 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