9

IEnumerable<int>C#メソッドにタイプのオプションのパラメーターがあります。null固定値リストなど、他のもので初期化できますか?

4

5 に答える 5

13

いいえ。コンパイル時定数のみを持つことができます。nullに割り当ててから

void SomeMethod(IEnumerable<int> list = null)
{
    if(list == null)
        list = new List<int>{1,2,3};
}

次のコードスニペットは、によって有名なC# in Depth本から取られていJon Skeetます。not set彼は、意味のあるデフォルト値を持つ可能性のあるパラメーターの一種のインジケーターとしてnullを使用することを提案しています。

static void AppendTimestamp(string filename,
                            string message,
                            Encoding encoding = null,
                            DateTime? timestamp = null)
{
     Encoding realEncoding = encoding ?? Encoding.UTF8;
     DateTime realTimestamp = timestamp ?? DateTime.Now;
     using (TextWriter writer = new StreamWriter(filename, true, realEncoding))
     {
         writer.WriteLine("{0:s}: {1}", realTimestamp, message);
     }
}

使用法

AppendTimestamp("utf8.txt", "First message");
AppendTimestamp("ascii.txt", "ASCII", Encoding.ASCII);
AppendTimestamp("utf8.txt", "Message in the future", null, new DateTime(2030, 1, 1));
于 2013-01-10T09:59:11.007 に答える
4

いいえ-デフォルトのパラメータはコンパイル時定数でなければなりません。

最善の策は、メソッドをオーバーロードすることです。または、デフォルト値をnullに設定し、メソッド内でnullを検出して、必要なリストに変換します。

于 2013-01-10T09:58:38.310 に答える
4

デフォルト値をnullとして、メソッド内で作成するのはどうですか

numbers = numbers ?? Enumerable.Empty<int>();

また

numbers = numbers ?? new []{ 1, 2, 3}.AsEnumerable();
于 2013-01-10T09:59:34.073 に答える
3

いいえ、コンパイル時定数が必要です。

ただし、回避策としてオーバーロードを使用できます。

public void Foo(int arg1)
{
      Foo(arg1, new[] { 1, 2, 3 });
}

public void Foo(int arg1, IEnumerable<int> arg2)
{
      // do something
}
于 2013-01-10T10:01:32.590 に答える
3

コンパイル時定数が必要なので、次のように設定する必要があります。null

しかし、あなたはあなたの方法で次のことをすることができます

 list = list ?? new List<int>(){1,2,3,4};
于 2013-01-10T10:02:55.193 に答える