需要理解解决歧义的属性前的@符号

Need to understand the @ sign before an attribute that resolves ambiguity

我正在向 class 的属性添加验证属性。我有一个库,假设是第三方库,其中包含 StringLengthAttribute。我们知道在System.ComponentModel.DataAnnotations.
下有一个同名的属性 我正在创建的 class 中同时使用第三方和 System.ComponentModel.DataAnnotations。这会导致 StringLengthAttribute 出现歧义。编译器建议在这样的属性中使用 @ [@StringLength()]。这就是我所做的,但是当我尝试 F12(转到定义) 时,它把我带到了第三方库。

我想了解属性中的 @ 符号是如何工作的,我想使用 System.ComponentModel.DataAnnotation.StringLengthAttribute 而不是第三方,鉴于第三方和 DataAnnotation 在 class 之上的使用部分声明。

[@StringLength(10)]
public string Name { get; set; }

C# 提供了一些语法糖,允许您在使用属性装饰成员时省略单词 Attribute。例如,如果您有一个名为 MyCustomAttribute 的属性,则可以在将其应用于方法时使用此 shorthand:

[MyCustom]
public void MyMethod()
{
  ...
}

这很好,直到您还声明了一个名为 "MyCustom" 的 class,它也派生自 Attribute。在这种情况下,C# 编译器不知道 [MyCustom] 是指您的 MyCustom class 还是 MyCustomAttribute class。通过在您的属性用法前加上 @ 前缀,您是在告诉编译器您要使用 class 以及 @ 后面的名称(即编译器不应附加 "Attribute").所以 [@MyCustom] 指的是 MyCustom class,而 [@MyCustomAttribute] 指的是 MyCustomAttribute class.

在您使用 [@StringLength(10)] 的示例中,编译器将该属性解析为名为 StringLength 的 class,而不是名为 StringLengthAttribute 的 class。

这是 C# 语言规范中的一个示例,可能比我更好地解释了这一点:

[AttributeUsage(AttributeTargets.All)]
public class X : Attribute
{}

[AttributeUsage(AttributeTargets.All)]
public class XAttribute : Attribute
{}

[X]                  // Error: ambiguity
class Class1 {}

[XAttribute]         // Refers to XAttribute
class Class2 {}

[@X]                  // Refers to X
class Class3 {}

[@XAttribute]         // Refers to XAttribute
class Class4 {}