2

有没有办法将单个对象T转换为T[]

使用 this 的一个例子是在将一个单一的传递给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 的数组并分配它不感兴趣...

4

5 回答 5

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());
于 2013-02-08T20:55:51.347 回答
4

没有演员允许这样做,但是您可以使用动态创建一个数组

string s = "blah";
foo(new [] { s });
于 2013-02-08T20:55:52.257 回答
2

C# 具有以下语法:

foo(new[] { s });
于 2013-02-08T20:55:46.917 回答
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 }); 
}
于 2013-02-08T20:57:06.773 回答
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 
    }
}
于 2013-02-08T21:40:13.397 回答