是否可以将元素直接转换为数组?

时间:2013-02-08 20:53:35

标签: c# casting

有没有办法将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的数组并分配它......

5 个答案:

答案 0 :(得分: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());

答案 1 :(得分:4)

没有强制转换允许这样做,但你可以使用

动态创建一个数组
string s = "blah";
foo(new [] { s });

答案 2 :(得分:2)

C#具有以下语法:

foo(new[] { s });

答案 3 :(得分: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 }); 
}

答案 4 :(得分:1)

由于你在注释中声明foo()是你无法修改的库的一部分,并假设foo()是一个实例方法,你可以扩展它以接受你想要的语法。

类Bar中foo()的原始实现示例:

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 
    }
}