解決
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つも持つことができないことです。試してもコンパイルできません。structenum
もう一度言うと、それは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上記で説明したのでないため)。したがって、ここでも、オプションのパラメーター自体に定数が必要であると言っているわけではありませんが、コンパイラーの既知の値です。