解決
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
を1つも持つことができないことです。試してもコンパイルできません。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
あなたが変更することはできませんとしてS struct
でコンストラクタをコード)。
default
またはをnew
簡単に提供できますが、を提供することはできませんconst
(これはプリミティブタイプまたはenum
上記で説明したのでないため)。したがって、ここでも、オプションのパラメーター自体に定数が必要であると言っているわけではありませんが、コンパイラーの既知の値です。