[解決済み】C#でパラメータをGuid.Emptyにデフォルト設定するにはどうすればよいですか?
質問
と言いたいのですが。
public void Problem(Guid optional = Guid.Empty)
{
}
しかし、コンパイラはGuid.Emptyがコンパイル時の定数でないと文句を言う。
APIを変更したくないので、使えません。
Nullable<Guid>
解決方法は?
解決方法
を使用することができます。
new Guid()
代わりに
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
を使用することもできます。
default(Guid)
default(Guid)
と同じように動作します。
new Guid()
.
Guidは参照型ではなく値型なので。
default(Guid)
とは等しくありません。
null
その代わり、デフォルトのコンストラクタを呼び出すことと同じになります。
ということは、これは
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
元の例と全く同じです。
説明
なぜ
Guid.Empty
は動作しますか?
エラーが発生する理由は
Empty
は次のように定義されています。
public static readonly Guid Empty;
つまり、定数ではなく、変数です(定義は
static readonly
としてではなく
const
). コンパイラは、メソッドパラメータのデフォルト値としてコンパイラが知っている値のみを持つことができます(実行時のみ既知の値ではありません)。
根本的な原因は
const
のうち、任意の
struct
とは異なり
enum
などがあります。試しにやってみると、コンパイルできません。
その理由は、もう一度言います。
struct
はプリミティブ型ではありません。
.NETにおけるすべてのプリミティブ型の一覧は、以下を参照してください。
http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(ただし
enum
は通常
int
プリミティブである)
しかし
new Guid()
も定数ではありません!
定数が必要だと言っているのではありません。コンパイル時に決定できるものが必要なのです。
Empty
はフィールドなので、その値はコンパイル時にはわかりません(実行時の一番最初だけ)。
デフォルトのパラメータ値はコンパイル時に知っておく必要があります。
const
のように、コンパイル時に値を知ることができる C# の機能を使って定義されたものです。
default(Guid)
または
new Guid()
(の場合、コンパイル時に決定される)。
struct
を変更することはできないので
struct
のコンストラクタを使用します)。
を提供することができますが
default
または
new
を簡単に提供することはできません。
const
(プリミティブ型でもなく、また
enum
で説明したとおりです)。つまり、オプショナル・パラメータそのものに定数が必要だとは言いませんが、コンパイラが知っている値であることは間違いありません。
関連
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み] Could not find a part of the path ... binroslyncsc.exe
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] 揮発性 vs. 連動性 vs. ロック性
-
[解決済み] C#でオプションのパラメータを使用するにはどうすればよいですか?
-
[解決済み] C#4 インターフェースで定義されたオプションパラメータは、なぜ実装クラスで強制されないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] C# 4.0: TimeSpanをデフォルト値でオプションのパラメータとして使用できますか?