需要理解解决歧义的属性前的@符号
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 {}
我正在向 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 {}