它们两个听起来很相似。来自于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
那么它们有什么不同的上下文呢?为什么BCL在.NET 4.5中新引入了HasDefaultValue
?