本文介绍以下编译器错误:
- CS0181: 属性构造函数参数具有类型,该类型不是有效的属性参数类型
- CS0243: 条件属性在“method”上无效,因为它是替代方法。
- CS0404: 特性在此声明类型上无效。
- CS0415: 此属性仅在不是显式接口成员声明的索引器上有效。
- CS0416: “类型参数”:属性参数不能使用类型参数。
- CS0447: 属性不能与类型参数一起使用。
- CS0577: 条件属性无效,因为它是构造函数、析构函数、运算符、lambda 表达式或显式接口实现。
- CS0578: 条件属性在“function”上无效,因为它的返回类型不为 void。
- CS0579: 重复属性
- CS0582: 条件属性在接口成员上无效。
- CS0592: 此声明类型的属性无效。它仅在特定声明中有效。
- CS0609: 无法在标记为重写的索引器上应用属性。
- CS0616: 类型不是属性类
- CS0625: 使用 StructLayout(LayoutKind.Explicit)标记的类型中的实例字段必须具有 FieldOffset 属性。
- CS0629: 条件成员“member”不能在类型“Type Name”中实现接口成员“基类成员”。
- CS0636: FieldOffset 属性只能放置在使用 StructLayout(LayoutKind.Explicit)标记的类型的成员上。
- CS0637:静态或常数字段不允许使用 FieldOffset 属性。
- CS0641: 此属性仅在派生自 System.Attribute'的类上有效。
- CS0646: 无法在包含索引器的类型上指定 DefaultMember 属性。
- CS0647: 发出属性时出错
- CS0653: 无法应用属性类“class”,因为它是抽象的。
- CS0657: 位置不是此声明的有效属性位置。列出了此声明的有效属性位置。此块中的所有属性将被忽略。
- CS0658: 位置不是可识别的属性位置。列出了此声明的有效属性位置。此块中的所有属性将被忽略。
- CS0668: 两个索引器具有不同的名称;IndexerName 属性必须在类型中的每个索引器上使用同一名称
- CS0685: 条件成员“member”不能有输出(out)参数。
- CS0735: 指定为 TypeForwardedTo 属性的参数的类型无效
- CS0739:TypeForwardedToAttribute属性重复
- CS1608: C# 类型不允许 RequiredAttribute 属性
- CS1614: 属性名称不明确。使用“@name”或显式包含“Attribute”后缀。
- CS1618: 无法使用方法创建委托,因为它或它重写的方法具有条件属性
- CS1667: 属性对属性或事件访问器无效。它仅在特定声明中有效。
- CS1689: 特性仅在方法或属性类上有效
- CS7014: 属性在此上下文中无效。
- CS7046: 必须指定属性参数。
- CS7047: 必须指定属性参数“parameter1”或“parameter2”。
- CS7067: 属性构造函数参数是可选的,但没有指定默认参数值。
- CS8959: 无法应用 CallerArgumentExpressionAttribute,因为没有从 type1 到 type2 的标准转换
- CS8960:应用于参数上的 CallerArgumentExpressionAttribute 将不会有任何效果,因为它被 CallerLineNumberAttribute 重写了。
- CS8961:应用于参数的 CallerArgumentExpressionAttribute 将失去作用。它被 CallerFilePathAttribute 重写。
- CS8962: 应用于参数的 `CallerArgumentExpressionAttribute` 将无效。它已被 `CallerMemberNameAttribute` 覆盖。
- CS8963: 应用于参数的 CallerArgumentExpressionAttribute 将不起作用。它使用无效的参数名称应用。
- CS8968: 属性类型参数不能使用类型参数
- CS8970: 无法在此上下文中使用类型,因为它不能在元数据中表示。
- CS9331: 无法手动应用属性。
属性参数和方法参数
错误地使用属性参数或参数时,会看到以下错误:
- CS0181: 属性构造函数参数具有类型,该类型不是有效的属性参数类型
- CS0416: “类型参数”:属性参数不能使用类型参数。
- CS0447: 属性不能与类型参数一起使用。
- CS0647: 发出属性时出错
- CS7046: 必须指定属性参数。
- CS7047: 必须指定属性参数“parameter1”或“parameter2”。
- CS7067: 属性构造函数参数是可选的,但没有指定默认参数值。
- CS8968: 属性类型参数不能使用类型参数
- CS8970: 无法在此上下文中使用类型,因为它不能在元数据中表示。
若要更正这些错误,请遵循以下规则:
- 属性构造函数参数必须使用有效的属性参数类型(CS0181)。 C# 语言规范将属性参数类型限制为基元类型(
bool、、、bytechardoublefloatintlongshortstringobjectSystem.Type枚举类型和这些类型的单维数组)。 不能在元数据中表示的函数指针和其他类型不是有效的属性参数类型。 - 属性参数必须是编译时常量值,因此不能将类型参数用作属性参数(CS0416)。 编译器必须在编译时解析属性参数,在构造泛型类型之前,类型参数未知。
- 不能将类型参数应用于非泛型属性(CS0447)。 如果特性类不是泛型的,则其用法不能在尖括号中包含类型参数。
- 传递给属性构造函数的所有值都必须正确格式化,并且在每个参数的有效范围内(CS0647)。 例如, GuidAttribute 需要有效的 GUID 格式字符串。
- 应用属性时,必须提供所有必需的属性参数(CS7046、 CS7047)。 检查属性的构造函数签名以确定哪些参数是必需的,并为每个参数提供有效参数。
- 使用可选构造函数参数定义自定义属性时,请指定这些参数的默认值(CS7067)。 使用属性构造函数中的语法
parameterType parameterName = defaultValue,以便调用方可以省略这些参数。 - 泛型属性类型参数必须是具体类型,而不是类型参数(CS8968)。 编译器必须在编译时完全确定泛型属性类型参数,因此不允许打开类型参数。
- 用作属性参数的类型必须在元数据中表示(CS8970)。 某些构造类型(例如涉及
dynamic或某些元组元素名称的类型)不能在元数据中编码,并且不允许作为属性类型参数进行编码。
有关详细信息,请参阅 属性、泛型,以及 C# 语言规范部分中的属性。
注释
CS0447 和 CS0647 已弃用。 当前编译器不会发出这些错误。
属性类要求
定义不符合所需约束的属性类时,会看到以下错误:
- CS0404: 特性在此声明类型上无效。
- CS0579: 重复属性
- CS0616: 类型不是属性类
- CS0641: 此属性仅在派生自 System.Attribute'的类上有效。
- CS0653: 无法应用属性类“class”,因为它是抽象的。
- CS1614: 属性名称不明确。使用“@name”或显式包含“Attribute”后缀。
若要更正这些错误,请遵循以下规则:
- 仅将属性应用于特性允许的 AttributeUsageAttribute 声明类型(CS0404)。
AttributeTargets检查属性AttributeUsage中指定的值以查看哪些目标有效。 - 如果将同一属性多次应用于单个目标,请删除重复的属性或在该属性的AttributeUsageAttribute中设置
AllowMultiple = true(CS0579)。 默认情况下,属性只能在每个目标上显示一次。 - 属性语法中使用的类型必须继承自 System.Attribute (CS0616)。 只能将派生自
System.Attribute的类用作属性。 其他类型会导致此错误,即使它们具有类似的名称。 - 你只能将 AttributeUsageAttribute 应用于从
Attribute(CS0641)派生的类。 该AttributeUsage属性控制如何使用其他属性,并且本身仅限于属性类。 - 属性类不能
abstract是因为编译器必须实例化它们(CS0653)。abstract从特性类中删除修饰符,或从抽象基派生具体类。 - 当这两个
Example类和ExampleAttribute属性类都存在时,编译器无法确定哪个[Example]类引用 (CS1614)。 使用[@Example]来表示较短的名称,或使用[ExampleAttribute]来表示较长的名称,以消除歧义。
有关详细信息,请参阅有关 属性的“创建自定义属性 ”和 “C# 语言规范”部分。
属性位置上下文
在无效位置应用属性或使用不正确的目标说明符时,会发生以下错误:
- CS0592: 此声明类型的属性无效。它仅在特定声明中有效。
- CS0657: 位置不是此声明的有效属性位置。列出了此声明的有效属性位置。此块中的所有属性将被忽略。
- CS0658: 位置不是可识别的属性位置。列出了此声明的有效属性位置。此块中的所有属性将被忽略。
- CS1667: 属性对属性或事件访问器无效。它仅在特定声明中有效。
- CS7014: 属性在此上下文中无效。
若要更正这些错误,请遵循这些规则。 有关详细信息,请参阅属性目标和C# 语言规范中关于属性规范的部分。
- 每个属性 AttributeUsageAttribute 指定其目标声明类型。 必须仅将属性应用于这些类型(CS0592)。 例如,不能将定义的
AttributeTargets.Interface属性应用于类。 - 使用属性目标说明符(如
method:或property:)时,说明符必须对出现的声明有效(CS0657)。 检查错误消息以查看哪些目标说明符被允许用于特定声明。 - 你使用的属性目标说明符不是已识别说明符(CS0658)。 有效说明符包括
assembly:、module:、type:、method:、property:、field:、event:、param:和return:。 - 某些属性(如 ObsoleteAttribute 和 CLSCompliantAttribute)在属性或事件访问器(CS1667)上无效。 将属性从访问器移动到属性或事件声明本身。
- 属性只能出现在支持它们的程序元素上(CS7014)。 如果要应用程序集级或模块级属性,请使用
assembly:或module:目标说明符并将其放置在文件顶部。
预定义属性
错误地使用特定预定义 .NET 属性时,会发生以下错误:
- CS0415: 此属性仅在不是显式接口成员声明的索引器上有效。
- CS0609: 无法在标记为覆盖的索引器上设置属性。
- CS0625: 使用 StructLayout(LayoutKind.Explicit)标记的类型中的实例字段必须具有 FieldOffset 属性。
- CS0636: FieldOffset 属性只能放置在使用 StructLayout(LayoutKind.Explicit)标记的类型的成员上。
- CS0637: 不允许在静态或常量字段上使用 FieldOffset 属性。
- CS0646: 无法在包含索引器的类型上指定 DefaultMember 属性。
- CS0668: 两个索引器具有不同的名称;IndexerName 属性必须在类型中的每个索引器上使用同一名称
- CS0735: 指定为 TypeForwardedTo 属性的参数的类型无效
- CS0739:重复的 TypeForwardedToAttribute
- CS1608: 不允许在 C# 类型上使用 RequiredAttribute 属性
- CS9331: 无法手动应用属性。
若要更正这些错误,请遵循这些规则。 有关详细信息,请参阅索引器、结构类型TypeForwardedToAttribute以及平台调用(P/Invoke)。
- IndexerNameAttribute只能应用于不是显式接口成员声明(CS0415)的索引器。 从显式接口索引器中删除属性,因为该接口已定义索引器名称。
- 您无法将
IndexerName应用于标记为override的索引器,因为重写的索引器从基类(CS0609)继承其名称。 删除重写索引器中的IndexerName属性。 - 标记为
StructLayout(LayoutKind.Explicit)的类型中的每个实例字段都必须有一个 FieldOffsetAttribute (CS0625)。 显式布局要求为每个实例字段指定字节偏移量。 -
FieldOffsetAttribute只能放置在StructLayoutAttribute设置为
LayoutKind.Explicit的类型成员上(CS0636)。 将StructLayout属性添加到包含类型声明中。 -
FieldOffset不允许对static或const字段使用此属性,因为显式布局仅适用于实例字段(CS0637)。 删除静态或常量字段中的FieldOffset属性。 - 不能在已包含索引器的类型上应用DefaultMemberAttribute,因为编译器会自动为这些类型定义默认成员(CS0646)。 删除
DefaultMember属性。 - 类型中的所有 IndexerNameAttribute 属性都必须指定相同的名称(CS0668)。 更改名称以匹配,因为运行时对类型上的所有索引器使用单个名称。
- 指定为参数 TypeForwardedToAttribute 的类型必须是非泛型、非嵌套、非指针、非数组类型(CS0735)。 只有顶级命名类型是有效的转发目标。
- 对于每个外部类型,程序集只能有一个 TypeForwardedToAttribute(CS0739)。 找到并删除重复
TypeForwardedTo声明。 - 不允许在 C#(CS1608)中定义的类型上使用 RequiredAttributeAttribute。 此属性保留给需要强制编译器要求特定功能的其他语言。
- 某些属性是为编译器保留的,不能在源代码(CS9331)中手动应用。 将属性替换为导致编译器生成它的等效 C# 语言语法。
条件属性用法
当您以违反使用限制的方式应用 ConditionalAttribute 时,会看到以下错误:
- CS0243: 条件属性在“method”上无效,因为它是替代方法。
- CS0577: 条件属性无效,因为它是构造函数、析构函数、运算符、lambda 表达式或显式接口实现。
- CS0578: 条件属性在“function”上无效,因为它的返回类型不为 void。
- CS0582: 条件属性在接口成员上无效。
- CS0629: 条件成员“member”不能在类型“Type Name”中实现接口成员“基类成员”。
- CS0685: 条件成员“member”不能有 out 参数。
- CS1618: 无法使用方法创建委托,因为它或它重写的方法具有条件属性
- CS1689: 特性仅在方法或属性类上有效
若要更正这些错误,请遵循这些规则。 有关详细信息,请参阅ConditionalAttribute条件方法和属性。
- 编译器将调用绑定到基方法声明,而不是重写方法,因此不能将
Conditional属性应用于 重写 方法(CS0243)。 从 override 方法中删除Conditional属性,或删除override关键字。 - 该
Conditional属性在构造函数、 终结器、运算符、lambda 表达式或显式接口实现(CS0577)上无效。 无法有条件地省略这些成员类型,因为它们在类型的生命周期或协定中具有所需的角色。 - 条件方法必须返回
void,因为编译器可能完全省略调用,并且没有返回值可供调用方 (CS0578) 使用。 将方法的返回类型更改为void或删除Conditional属性。 - 接口成员不能是有条件的,因为所有接口成员都必须实现(CS0582)。 从接口成员声明中删除
Conditional属性。 - 实现接口成员的方法不能是有条件的,因为接口协定要求它们存在于所有内部版本(CS0629)。 从实现方法中删除
Conditional属性。 - 条件方法不能具有
out参数,out因为当编译器省略方法调用(CS0685)时,变量值将未定义。out从方法中删除参数,或删除Conditional属性。 - 无法创建引用条件方法的委托,因为在未定义条件符号的编译中,该方法可能不存在(CS1618)。
Conditional从方法中删除该属性,或者不要将其用作委托目标。 - 该
Conditional属性仅在方法和属性类(CS1689)上有效。 它不适用于其他声明类型,例如非属性类、结构或接口。
CallerArgumentExpression 属性用法
如果应用 CallerArgumentExpressionAttribute 错误或与其他调用方信息属性冲突,则会发生以下错误:
- CS8959: 无法应用 CallerArgumentExpressionAttribute,因为没有从 type1 到 type2 的标准转换
- CS8960:应用于参数的 CallerArgumentExpressionAttribute 将不会生效,因为它被 CallerLineNumberAttribute 覆盖。
- CS8961: 应用于参数的 CallerArgumentExpressionAttribute 将不会生效。该特性被 CallerFilePathAttribute 重写。
- CS8962: 应用于参数的 CallerArgumentExpressionAttribute 将不起作用。它由 CallerMemberNameAttribute 重写。
- CS8963: 应用于参数的 CallerArgumentExpressionAttribute 将不起作用。它使用无效的参数名称应用。
若要更正这些错误,请遵循这些规则。 有关详细信息,请参阅 调用方信息属性 和 CallerArgumentExpressionAttribute。
- 使用
CallerArgumentExpression修饰的参数必须为类型string或可从类型string标准转换的类型,因为属性会注入调用方参数表达式string的表示形式(CS8959)。 将参数类型更改为string类型或与之兼容的类型。 - 该
CallerArgumentExpression属性对同时具有CallerLineNumberAttribute、CallerFilePathAttribute或CallerMemberNameAttribute的参数没有影响(CS8960、CS8961、CS8962)。 这些调用方信息属性具有优先级,因此请从参数中删除该CallerArgumentExpression属性。 - 传递给构造函数的
CallerArgumentExpression字符串参数必须与同一方法签名(CS8963)中另一个参数的名称匹配。 如果参数名称拼写错误或引用不存在的参数,则特性不起作用。