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# でこのタイプのキャストが許可されているかどうかを確認しています。

([s])このように[]でラップするだけで、Javaがそれを可能にする方法を見たと思いました。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

いいえ、単一の文字列は文字列の配列ではないため、配列にキャストしても意味がありません。ここでできる最も簡単なことは次のとおりです。

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 に答える
2

C# には次の構文があります。

foo(new[] { s });
于 2013-02-08T20:55:46.917 に答える
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 に答える