Как передать один объект [] объекту 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?
Ответ #1
Ответ на вопрос: Как передать один объект [] объекту params []
Простое приведение типов гарантирует, что 9X_csharp компилятор знает, что вы имеете в виду в 9X_c# данном случае.
Foo((object)new object[]{ (object)"1", (object)"2" }));
Поскольку массив является 9X_javascript-array подтипом объекта, все работает. Хотя решение 9X_.cs-file странное, соглашусь.
- Я понял, что не ясно дал понять, что я очень уважаю Андерса Хейлсберга, он о ...
Ответ #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.
Ответ #3
Ответ на вопрос: Как передать один объект [] объекту params []
Это однострочное решение, включающее LINQ.
var elements = new String[] { "1", "2", "3" };
Foo(elements.Cast
9X_bytearray
Ответ #4
Ответ на вопрос: Как передать один объект [] объекту params []
Вам нужно инкапсулировать его в другой массив 9X_c-sharp object[], например:
Foo(new Object[] { new object[]{ (object)"1", (object)"2" }});
Ответ #5
Ответ на вопрос: Как передать один объект [] объекту params []
Другой способ решить эту проблему (это не 9X_arrays очень хорошая практика, но выглядит красиво):
static class Helper
{
public static object AsSingleParam(this object[] arg)
{
return (object)arg;
}
}
Использование:
f(new object[] { 1, 2, 3 }.AsSingleParam());
Ответ #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 });
}
Ответ #7
Ответ на вопрос: Как передать один объект [] объекту params []
new[] { (object) 0, (object) null, (object) false }
9X_c-sharp
-
21
-
6
-
22
-
16
-
6
-
14
-
13
-
6
-
5
-
7
-
23
-
5
-
7
-
4
-
4
-
9
-
4
-
47
-
7
-
6
-
2
-
18
-
10
-
4
-
8
-
2
-
12
-
6
-
11
-
8
-
3
-
8
-
11
-
5
-
8
-
4
-
6
-
5
-
9
-
7
-
5
-
3
-
4
-
6
-
8
-
6
-
3
-
2
-
5
-
4