为什么属性称为 [Serializable] 而不是 [SerializableAttribute] (C#)

Why is the attribute called [Serializable] and not [SerializableAttribute] (C#)

我对 .NET 属性的理解存在漏洞。 Serializable class 的 class 定义是这样的:

namespace System {
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)]
    [ComVisible(true)]
    public sealed class SerializableAttribute : Attribute {
        public SerializableAttribute();
    }
}

为什么当您使用它时它被称为 [Serializable] 而不是 [SerializableAttribute]?虽然你似乎可以使用后者。

这里发生了某种别名吗?这将是 "doh!" 我怀疑的时刻...

C# 语言规范允许编译器推断类型名称的 'Attribute' 部分。正如@Jim 在评论中解释的那样,您可以明确包含类型名称的 'Attribute' 部分,但这不是必需的。两种用法在语义上是等价的。

允许此行为的 C# 语言规范部分的 MSDN 文章 here goes into further detail under the 'Using an Attribute Class' section. Last but not least, the actual citation

By convention, attribute classes are named with a suffix of Attribute. Uses of an attribute may either include or omit this suffix.