2013-01-10 11 views

答えて

8

いいえ、あなたはコンパイル時定数しか持てません。あなたはnullにで割り当てることができ、その後、

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

次のコードスニペットはJon Skeetに周知C# in Depth本から取っています。 Page 371彼は、意味のあるデフォルト値を持つ可能性がある、パラメータのためのある種の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); 
    } 
} 

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

または

numbers = numbers ?? new []{ 1, 2, 3}.AsEnumerable(); 
+0

このパターンの本当に素晴らしい副作用は、デフォルトのパラメータの呼び出しサイトバインドで問題が発生しないことです。いくつかのクラスライブラリは、デフォルトを変更し、ライブラリが更新されたときにそれらを有効にすることができるためです。したがって、この問題を回避する:http://stackoverflow.com/a/664691/84206 – AaronLS

4

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

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

4

定数。

しかし、あなたは周りの仕事としてオーバーロードを使用することができます。

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

public void Foo(int arg1, IEnumerable<int> arg2) 
{ 
     // do something 
} 
3

NULLとしてそのデフォルト値を作成し、メソッド内についていいえ、あなたはコンパイル時間を必要とするどのように使用

AppendTimestamp("utf8.txt", "First message"); 
AppendTimestamp("ascii.txt", "ASCII", Encoding.ASCII); 
AppendTimestamp("utf8.txt", "Message in the future", null, new DateTime(2030, 1, 1)); 
+0

私はあなたが2番目のものから最初のメソッドを呼び出すと思うが、+1 –

+0

@ lazyberezovsky:既に編集、ありがとう。 –

3

さてあなたは、時定数をコンパイルする必要があるので、あなたはnull

に設定する必要がありますが、その後、あなたの方法で、次の操作を行うことができます

list = list ?? new List<int>(){1,2,3,4}; 
関連する問題