编译器错误 CS1614

“name”的含义不明确,有可能表示“name”,也有可能表示“nameAttribute”;使用“@name”或“nameAttribute”。

编译器遇到了不明确的属性指定。

为方便起见,C# 编译器允许将“ExampleAttribute”指定为 [Example]。 但是,如果名为 Example 的属性类与“ExampleAttribute”同时存在,则会引起歧义,因为编译器无法确定 [Example] 是指 Example 属性还是“ExampleAttribute”属性。 为阐释清楚,将 [@Example] 用作 Example 属性,将 [ExampleAttribute] 用作“ExampleAttribute”。

下面的示例生成 CS1614:

// CS1614.cs  
using System;  
  
// Both of the following classes are valid attributes with valid  
// names (MySpecial and MySpecialAttribute). However, because the lookup  
// rules for attributes involves auto-appending the 'Attribute' suffix  
// to the identifier, these two attributes become ambiguous; that is,  
// if you specify MySpecial, the compiler can't tell if you want  
// MySpecial or MySpecialAttribute.  
  
public class MySpecial : Attribute {  
   public MySpecial() {}  
}  
  
public class MySpecialAttribute : Attribute {  
   public MySpecialAttribute() {}  
}  
  
class MakeAWarning {  
   [MySpecial()] // CS1614  
                 // Ambiguous: MySpecial or MySpecialAttribute?  
   public static void Main() {  
   }  
  
   [@MySpecial()] // This isn't ambiguous, it binds to the first attribute above.  
   public static void NoWarning() {  
   }  
  
   [MySpecialAttribute()] // This isn't ambiguous, it binds to the second attribute above.  
   public static void NoWarning2() {  
   }  
  
   [@MySpecialAttribute()] // This is also legal.  
   public static void NoWarning3() {  
   }  
}