私のC#メソッドには、タイプIEnumerable<int>
のオプションパラメータがあります。それ以外で初期化することはできますか?null
値の固定リスト?IEnumerable <int>を省略可能なパラメータとして初期化する
答えて
いいえ、あなたはコンパイル時定数しか持てません。あなたは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();
いいえ - デフォルトパラメータはコンパイル時定数でなければなりません。
あなたの最善の方法は、メソッドをオーバーロードすることです。あるいは、デフォルト値をnullに設定し、メソッド内でnullを検出して、それを必要なリストに変換します。
定数。
しかし、あなたは周りの仕事としてオーバーロードを使用することができます。
public void Foo(int arg1)
{
Foo(arg1, new[] { 1, 2, 3 });
}
public void Foo(int arg1, IEnumerable<int> arg2)
{
// do something
}
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));
私はあなたが2番目のものから最初のメソッドを呼び出すと思うが、+1 –
@ lazyberezovsky:既に編集、ありがとう。 –
さてあなたは、時定数をコンパイルする必要があるので、あなたはnull
に設定する必要がありますが、その後、あなたの方法で、次の操作を行うことができます
list = list ?? new List<int>(){1,2,3,4};
- 1. キュウリの省略可能なパラメータ
- 2. ASP WebAPIジェネリックリストの省略可能なパラメータ
- 3. 省略可能なサブフィールド
- 4. HTMLスタイルガイドGoogle vs W3Schools(省略可能なタグを省略)
- 5. オプションの場合は省略可能な変数を初期化する最良の方法
- 6. 指定初期化子と省略要素
- 7. c#のラムダ式で省略可能な/省略可能なパラメータを使用することはできますか?
- 8. スウィフト関数の省略可能なデフォルトパラメータ
- 9. 未定義のプロパティの省略、javascriptのプロパティの初期化と割り当て
- 10. WSDLモードを使用したSoapコールでは省略可能なパラメータ
- 11. C - パラメータ名省略
- 12. TypeScriptクラスの省略可能なプロパティを省略するとデフォルト値に戻りますか?
- 13. std :: arrayを初期化する方法末尾の '\ 0'を省略した文字列リテラルで<char, N>を初期化する
- 14. マルチパラメータカリング関数の最初のパラメータを省略します
- 15. 省略時の値と同じに設定されている省略可能なパラメータを決定するか、デフォルト値を持つ
- 16. 省略可能なパラメータとしてTimeSpanをデフォルト値で使用できますか?
- 17. 実行可能な初期化エラー
- 18. なぜScalaでdefで省略可能なのですか
- 19. OOPの初期化戦略
- 20. swift 2.2:怠惰なプロパティで初期化可能な初期化ツール
- 21. ActiveModel ::パラメータなしのクラスを初期化するときのモデルエラー
- 22. "引数は省略可能な" VBA ExcelのSUB
- 23. 匿名メソッドを使用して観察可能なコレクションを初期化する
- 24. MS Access VBA:省略可能な引数がデフォルト値を使用しない
- 25. 省略記号( `...`)オブジェクトを最初から作成することは可能ですか?
- 26. 可能性:Jinja2フィルターチェーンを使用するときに "place holderを省略"
- 27. m:nを1つの省略可能なデフォルト値でモデリングする方法?
- 28. Bashで省略可能な/(ディレクトリ区切り文字)を削除する
- 29. WCFサービスクライアントの初期化戦略
- 30. 変数が初期化されていない可能性があります。初期化するときに機能しません。
このパターンの本当に素晴らしい副作用は、デフォルトのパラメータの呼び出しサイトバインドで問題が発生しないことです。いくつかのクラスライブラリは、デフォルトを変更し、ライブラリが更新されたときにそれらを有効にすることができるためです。したがって、この問題を回避する:http://stackoverflow.com/a/664691/84206 – AaronLS