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