私はさまざまなシナリオを説明するためのサンプルとして使用することを、次のコードを持っている:オプションのGuidのリフレクションでDefaultValueを取得していますか?
public static void MethodWithOptionalGuid(Guid id = default(Guid)) { }
public static void MethodWithOptionalInteger(int id = 2) { }
public static void MethodWithOptionalString(string id = "33344aaa") { }
public static void MethodWithoutOptionalParameter(int id, Guid longId) { }
static void Main(string[] args)
{
var methods = typeof(Program).GetMethods(BindingFlags.Public | BindingFlags.Static).ToList();
foreach (var method in methods)
{
PrintMethodDetails(method);
}
Console.ReadLine();
}
static void PrintMethodDetails(MethodInfo method)
{
Console.WriteLine(method.Name);
foreach (var parameter in method.GetParameters().ToList())
{
Console.WriteLine(parameter.Name +
" of type " + parameter.ParameterType.ToString() +
" with default value:" + parameter.DefaultValue);
}
Console.WriteLine();
}
それは次のように出力されます
MethodWithOptionalGuid
id of type System.Guid with default value:
MethodWithOptionalInteger
id of type System.Int32 with default value:2
MethodWithOptionalString
id of type System.String with default value:33344aaa
MethodWithoutOptionalParameter
id of type System.Int32 with default value:
longId of type System.Guid with default value:
出力は、最後の3つの方法のための罰金です。
私の質問は、最初のMethodWithOptionalGuidに関するものです:Guidのデフォルト値が認識されないのはなぜですか?
"0000000 -..."のようなものを受け取ると予想されます。私はまた、新しいGuid()と同じ結果でオプションのパラメータを初期化しようとしました。私はTimeSpanのような他の構造体も試してみたところ、動作は同じです。
私はすべての値の型が(整数の例に見られるように)同じように動作すると予想しました。
追加:Asp.Net MVCでオプションのGuidパラメータを使用してアクションを実行しようとしているときにこの問題が検出されましたが、失敗しました(Guidをnullにする必要がありました)。 MVCコードを調べ、ある時点でDefaultValueを使用していることがわかりました。だから私は私の問題をよりよく説明するために、このコードサンプルを作成しました。
を行うことができませんでした。私は最後の3つの方法について、出力が私が期待したものであることに同意しますが、私は最初の方法の出力を理解するのに問題があります。 –
私はOPの質問は主に 'MethodWithOptionalGuid'だと思います。デフォルト値が指定されていて、なぜデフォルト(Guid)が "0000 .."にならないのか不思議です。 –
@RaphaëlAlthausまたデフォルト(Guid)|新しいGuid()はコンパイラに既知の値であり、動作するはずです。根本原因は、Guid.Emptyを使用できない理由を説明します。 –