どちらも同じように聞こえます。msdn から:
このパラメーターが省略可能かどうかを示す値を取得します。
このメソッドは、オプションのメタデータ フラグに依存します。このフラグはコンパイラによって挿入できますが、コンパイラはそうする義務はありません。
このメソッドは、ParameterAttributes 列挙子の Optional フラグを利用します。
ParameterInfo.HasDefaultValue (.NET 4.5 の新機能)
このパラメーターに既定値があるかどうかを示す値を取得します。
それらは同じではありませんか?簡単なテストを行いました:
public void A(string value)
{
}
public void B(string value, int i = -1)
{
}
私が書いた:
var a = AInfo.GetParameters().Select(p => p.HasDefaultValue).ToArray();
var b = AInfo.GetParameters().Select(p => p.IsOptional).ToArray();
var c = BInfo.GetParameters().Select(p => p.HasDefaultValue).ToArray();
var d = BInfo.GetParameters().Select(p => p.IsOptional).ToArray();
//a equals b; and c equals d
では、それらはどのような文脈で異なるのでしょうか? BCLHasDefaultValue
が .NET 4.5 で新たに導入されたのはなぜですか?