2013-02-08 3 views
2

Есть ли способ бросить один объект T к T[]Можно ли привести элемент непосредственно к массиву?

пример того, где это будет использоваться, в то время прохождения одного string до функций, который требует пример string[]

void ExistingMethod(string[] sa); 
void main() 
{ 
    string s; 
    ExistingMethod(s); //<= problem is there a syntax that allows this type of cast? 
} 

не заинтересованы в решении, как этот

string [] singleElementArray = new string[1]; 
singleElementArray[0] = s; 
ExistingMethod(singleElementArray) 

Я ищу, чтобы увидеть, разрешает ли C# такой тип литья.

Мне показалось, что я видел способ, которым Java позволяет это просто обернуть его таким образом: ([s]) с []. Имеет ли C# этот тип синтаксиса?

Примечание, не заинтересован в создании массива 1 и назначение его ...

+6

'foo (new [] {s})', вероятно, самый короткий. – vcsjones

+0

. Вместо этого следует добавить 'void foo (string s)' - вы сможете иметь дело с преобразованием таким образом, чтобы ваш код находил полезным и имел код, который вызывает одну из функций, чтобы выглядеть так, как будто вам требуется волшебное преобразование. –

+0

@AlexeiLevenkov Это из библиотеки классов. –

ответ

4

Там нет броска, чтобы позволить этому, но вы можете создать массив на лету с

string s = "blah"; 
foo(new [] { s }); 
+0

@vcsjones вы указали информацию сначала, но не ответили на вопрос, только прокомментировали :( – vbbartlett

2

C# имеет следующий синтаксис:

foo(new[] { s }); 
13

Изменение foo(string[] sa) в foo(params string[] sa).

params позволяет поместить массив, который принимает массив параметров параметра массив следующим образом: foo(foo, bar, baz); вместо foo(new[]{foo, bar, baz});

Или вы могли бы сделать .Arr<T>(this T obj) функцию, которая возвращает T[]. Что-то вроде этого:

public static T[] Arr<T>(this T obj) 
{ 
return new[]{ obj }; 
} 

, а затем использовать его как это:

foo(obj.Arr()); 
+0

Мне нравится это предложение, можете ли вы предоставить более подробную информацию о том, что это делает и как это помогает аферу? – vcsjones

+1

params позволяет помещать массив параметров следующим образом: foo (s, a, b) вместо foo (new [] {s, a, b}). –

+1

@ofstream, добавьте свой комментарий к своему сообщению выше. –

2

Нет , одна строка не является массивом строк, поэтому не имеет смысла бросать ее в массив. Самое простое, что можно сделать здесь:

void foo(string[] sa); 
void main() 
{ 
    string s = "some value"; // A string must have a value before you can use it 
    foo(new[]{ s }); 
} 
1

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

Пример оригинальная реализация Foo() в классе Bar:

class Bar { 
    public void foo(string[] s) { 
     foreach (var s1 in s) { 
      Console.WriteLine(s1);     
     } 
    } 
} 

Ваше расширение Foo():

static class BarExtensions { 
    public static void foo(this Bar bar, string s) { 
     bar.foo(new[] {s}); 
    } 
} 

Ваш пример вызова, модифицирована использовать внешний класс:

class Program { 
    static void Main() { 
     var bar = new Bar(); 
     string s = "hello"; 
     bar.foo(s); // This is how you wanted to call it 
    } 
} 
+0

Я определенно мог бы сделать что-то подобное, но снова меня интересует кастинг и синтаксис языка. – vbbartlett

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