'constructor' 不是可识别的属性位置
'constructor' is not a recognized attribute location
尝试编译以下代码后:
public sealed class Program
{
[constructor: CLSCompliant(false)]
public Program()
{
}
}
我收到以下错误:
'constructor' is not a recognized attribute location. Valid attribute locations for this declaration are 'method'. All attributes in this block will be ignored. [Console.NET]csharp(CS0658)
我知道存在以下位置:assembly
、module
、method
、parameter
、return
等。所以,我的猜测是 constructor
也应该存在(因为我们也可以将构造函数作为属性的目标)。不过这里好像不是这样。
此外,我无法在 MSDN 上找到已识别属性位置的完整列表。因此,如果有人向 MSDN 上的位置列表提供 link,那将会很有帮助。
我对 constructor
位置存在的猜测是基于我在 C# via CLR 一书中遇到以下代码示例:
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
[assembly: CLSCompliant(true)]
[Serializable]
[DefaultMemberAttribute("Main")]
[DebuggerDisplayAttribute("Richter", Name = "Jeff", Target = typeof(Program))]
public sealed class Program
{
[Conditional("Debug")]
[Conditional("Release")]
public void DoSomething() { }
public Program()
{
}
[CLSCompliant(true)]
[STAThread]
public static void Main()
{
// Show the set of attributes applied to this type
ShowAttributes(typeof(Program));
// Get the set of methods associated with the type
var members =
from m in typeof(Program).GetTypeInfo().DeclaredMembers.OfType<MethodBase>()
where m.IsPublic
select m;
foreach (MemberInfo member in members)
{
// Show the set of attributes applied to this member
ShowAttributes(member);
}
}
private static void ShowAttributes(MemberInfo attributeTarget)
{
var attributes = attributeTarget.GetCustomAttributes<Attribute>();
Console.WriteLine("Attributes applied to {0}: {1}",
attributeTarget.Name, (attributes.Count() == 0 ? "None" : String.Empty));
foreach (Attribute attribute in attributes)
{
// Display the type of each applied attribute
Console.WriteLine(" {0}", attribute.GetType().ToString());
if (attribute is DefaultMemberAttribute)
Console.WriteLine(" MemberName={0}",
((DefaultMemberAttribute)attribute).MemberName);
if (attribute is ConditionalAttribute)
Console.WriteLine(" ConditionString={0}",
((ConditionalAttribute)attribute).ConditionString);
if (attribute is CLSCompliantAttribute)
Console.WriteLine(" IsCompliant={0}",
((CLSCompliantAttribute)attribute).IsCompliant);
DebuggerDisplayAttribute dda = attribute as DebuggerDisplayAttribute;
if (dda != null)
{
Console.WriteLine(" Value={0}, Name={1}, Target={2}",
dda.Value, dda.Name, dda.Target);
}
}
Console.WriteLine();
}
}
这个程序的输出如下:
Attributes applied to Program:
System.SerializableAttribute
System.Diagnostics.DebuggerDisplayAttribute
Value=Richter, Name=Jeff, Target=Program
System.Reflection.DefaultMemberAttribute
MemberName=Main
Attributes applied to DoSomething:
System.Diagnostics.ConditionalAttribute
ConditionString=Release
System.Diagnostics.ConditionalAttribute
ConditionString=Debug
Attributes applied to Main:
System.CLSCompliantAttribute
IsCompliant=True
System.STAThreadAttribute
Attributes applied to .ctor: None
输出清楚地表明构造函数的处理方式不同于 class and 方法。由于有位置 class
和 method
,我希望 constructor
位置也存在。
我需要这个只是为了学习目的。
属性目标列表出现在两个地方:
- 限制属性的适用范围(通过 AttributeUsageAttribute)
- 消除在每个特定情况下属性适用的歧义(通过“属性目标
")
那么为什么我们有 "method" 但没有 "constructor" 目标(我的解释,我不知道官方推理):
- "method" 适用于方法和属性。它包括构造函数作为方法的特殊变体。所以有一种方法可以允许在构造函数上使用属性,而不是在程序集或字段上使用。
- 当属性应用于构造函数时,默认 "method" 目标没有其他可能的选择,因为构造函数仅匹配目标列表中的 "method" 选项(不同于 auto-属性例如,属性可以被视为目标 "method" 或 "property" 甚至 "field")
- 大概没有有用的情况,属性必须仅限于构造函数。
旁注:由于属性本身通常不执行任何操作,因此属性目标主要是为了限制设置了属性但没有任何影响的潜在情况。如果你只想 "target" 构造函数,一些好的命名可能就足够了。如果你真的想限制在构造函数上,你可以在 startup/first 需要检查你的自定义属性。
尝试编译以下代码后:
public sealed class Program
{
[constructor: CLSCompliant(false)]
public Program()
{
}
}
我收到以下错误:
'constructor' is not a recognized attribute location. Valid attribute locations for this declaration are 'method'. All attributes in this block will be ignored. [Console.NET]csharp(CS0658)
我知道存在以下位置:assembly
、module
、method
、parameter
、return
等。所以,我的猜测是 constructor
也应该存在(因为我们也可以将构造函数作为属性的目标)。不过这里好像不是这样。
此外,我无法在 MSDN 上找到已识别属性位置的完整列表。因此,如果有人向 MSDN 上的位置列表提供 link,那将会很有帮助。
我对 constructor
位置存在的猜测是基于我在 C# via CLR 一书中遇到以下代码示例:
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
[assembly: CLSCompliant(true)]
[Serializable]
[DefaultMemberAttribute("Main")]
[DebuggerDisplayAttribute("Richter", Name = "Jeff", Target = typeof(Program))]
public sealed class Program
{
[Conditional("Debug")]
[Conditional("Release")]
public void DoSomething() { }
public Program()
{
}
[CLSCompliant(true)]
[STAThread]
public static void Main()
{
// Show the set of attributes applied to this type
ShowAttributes(typeof(Program));
// Get the set of methods associated with the type
var members =
from m in typeof(Program).GetTypeInfo().DeclaredMembers.OfType<MethodBase>()
where m.IsPublic
select m;
foreach (MemberInfo member in members)
{
// Show the set of attributes applied to this member
ShowAttributes(member);
}
}
private static void ShowAttributes(MemberInfo attributeTarget)
{
var attributes = attributeTarget.GetCustomAttributes<Attribute>();
Console.WriteLine("Attributes applied to {0}: {1}",
attributeTarget.Name, (attributes.Count() == 0 ? "None" : String.Empty));
foreach (Attribute attribute in attributes)
{
// Display the type of each applied attribute
Console.WriteLine(" {0}", attribute.GetType().ToString());
if (attribute is DefaultMemberAttribute)
Console.WriteLine(" MemberName={0}",
((DefaultMemberAttribute)attribute).MemberName);
if (attribute is ConditionalAttribute)
Console.WriteLine(" ConditionString={0}",
((ConditionalAttribute)attribute).ConditionString);
if (attribute is CLSCompliantAttribute)
Console.WriteLine(" IsCompliant={0}",
((CLSCompliantAttribute)attribute).IsCompliant);
DebuggerDisplayAttribute dda = attribute as DebuggerDisplayAttribute;
if (dda != null)
{
Console.WriteLine(" Value={0}, Name={1}, Target={2}",
dda.Value, dda.Name, dda.Target);
}
}
Console.WriteLine();
}
}
这个程序的输出如下:
Attributes applied to Program:
System.SerializableAttribute
System.Diagnostics.DebuggerDisplayAttribute
Value=Richter, Name=Jeff, Target=Program
System.Reflection.DefaultMemberAttribute
MemberName=Main
Attributes applied to DoSomething:
System.Diagnostics.ConditionalAttribute
ConditionString=Release
System.Diagnostics.ConditionalAttribute
ConditionString=Debug
Attributes applied to Main:
System.CLSCompliantAttribute
IsCompliant=True
System.STAThreadAttribute
Attributes applied to .ctor: None
输出清楚地表明构造函数的处理方式不同于 class and 方法。由于有位置 class
和 method
,我希望 constructor
位置也存在。
我需要这个只是为了学习目的。
属性目标列表出现在两个地方:
- 限制属性的适用范围(通过 AttributeUsageAttribute)
- 消除在每个特定情况下属性适用的歧义(通过“属性目标 ")
那么为什么我们有 "method" 但没有 "constructor" 目标(我的解释,我不知道官方推理):
- "method" 适用于方法和属性。它包括构造函数作为方法的特殊变体。所以有一种方法可以允许在构造函数上使用属性,而不是在程序集或字段上使用。
- 当属性应用于构造函数时,默认 "method" 目标没有其他可能的选择,因为构造函数仅匹配目标列表中的 "method" 选项(不同于 auto-属性例如,属性可以被视为目标 "method" 或 "property" 甚至 "field")
- 大概没有有用的情况,属性必须仅限于构造函数。
旁注:由于属性本身通常不执行任何操作,因此属性目标主要是为了限制设置了属性但没有任何影响的潜在情况。如果你只想 "target" 构造函数,一些好的命名可能就足够了。如果你真的想限制在构造函数上,你可以在 startup/first 需要检查你的自定义属性。