1. ホーム
  2. c#

[解決済み】C#でパラメータをGuid.Emptyにデフォルト設定するにはどうすればよいですか?

2022-04-23 23:20:01

質問

と言いたいのですが。

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 で説明したとおりです)。つまり、オプショナル・パラメータそのものに定数が必要だとは言いませんが、コンパイラが知っている値であることは間違いありません。