它们听起来很相似。来自 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
那么它们在哪些情况下不同呢?为什么HasDefaultValue
在.NET 4.5 中新引入了BCL?