0

参考 System.ComponentModel.AttributeCollection.this[Type t] 索引器, http: //msdn.microsoft.com/en-us/library/yadycs8s.aspx上的文档说如下

如果集合中不存在该属性,则此属性返回该属性类型的默认值。

考虑到这一点,以下代码按预期工作:(> 表示输出)

using System.ComponentModel;
var attrCollection = new AttributeCollection();
Console.WriteLine(attrCollection[typeof(BrowsableAttribute)] != null);
> "True"

正如我所期望的那样打印“True”。但是尝试使用另一个随机属性(如 DebuggerDisplay)时,索引器返回 null:

var attrCollection = new AttributeCollection();
Console.WriteLine(attrCollection[typeof(System.Diagnostics.DebuggerDisplayAttribute)] != null);
> "False"

关于这些属性之间有什么不同导致不同行为的任何想法?我不清楚 msdn 的“属性类型的默认值”是什么意思,因为它不仅仅是 null。我认为问题可能是没有无参数构造函数的属性类型,但 BrowsableAttribute 需要一个参数,DebuggerDisplayAttribute 也是如此。

4

1 回答 1

2

它在 AttributeCollection 的 MSDN 库文章中明确记录:

虽然大多数属性都有默认值,但默认值不是必需的。如果属性没有默认值,则从采用类型的索引属性返回 null。在定义自己的属性时,您可以通过提供不带参数的构造函数或定义名为“Default”的属性类型的公共静态字段来声明默认值。

BrowsableAttribute 有这样一个默认值,由其 Default 字段提供,因此您的测试成功。当属性缺失时,默认情况下它使类成员可浏览。

DebuggerDisplayAttribute 既没有默认构造函数,也没有默认字段。如果您考虑一下,这是有道理的,在调试器中没有有意义的默认值。

于 2013-04-17T22:45:35.147 回答