C# 为什么自定义属性的命名参数需要`:`语法?

C# 为什么自定义属性的命名参数需要`:`语法?,c#,asp.net,asp.net-mvc,intellisense,C#,Asp.net,Asp.net Mvc,Intellisense,我定义了以下自定义属性: [AttributeUsage(AttributeTargets.All)] 公共类CustomAuthAttribute:AuthorizeAttribute { 请求的私有MyPermissionLevel访问级别; 公共CustomAuthAttribute(对象访问级别=null) { AccessLevel=AccessLevel??MyPermissionLevel.View; if(AccessLevel.GetType()!=typeof(MyPermi

我定义了以下自定义属性:

[AttributeUsage(AttributeTargets.All)]
公共类CustomAuthAttribute:AuthorizeAttribute
{
请求的私有MyPermissionLevel访问级别;
公共CustomAuthAttribute(对象访问级别=null)
{
AccessLevel=AccessLevel??MyPermissionLevel.View;
if(AccessLevel.GetType()!=typeof(MyPermissionLevel))
{
抛出新ArgumentException(“AccessLevel无效”);
}
this.requestedAccessLevel=(MyPermissionLevel)AccessLevel;
}
…//其他身份验证的东西
}
例如,当我将此属性应用于控制器时,
[CustomAuthAttribute(AccessLevel=MyPermissionLevel.Modify)]
intellisense会抱怨:

找不到类型或命名空间名称“AccessLevel”。(等等?)

Alt+Enter显示的潜在修复包括:

将“AccessLevel”更改为“AccessLevel:”

添加这个冒号(意味着删除
=
操作符,它不是建议修复的自动部分)可以解决编译错误

我可以使用不同的语法,如果需要的话。但是,我想了解我所做的哪些工作阻止了我使用更常见的属性字段初始化语法,如父类的答案中所述:


[Authorize(Roles=“Modifiers”)]

冒号是必需的,因为这是命名参数的语法。该字段不是公共字段,您也不尝试分配给它。该字段的名称是
requestedAccessLevel
,而不是
AccessLevel

父类有一个公共属性
角色
,因此在该行中:

[Authorize(Roles = "Modifiers")]

角色
不是命名构造函数参数,它是属性,因此不使用命名参数语法。实际上,该属性没有接受参数的构造函数。它只有公共的可分配属性。

[CustomAuthAttribute(MyPermissionLevel.Modify)]
应该可以

表单
[CustomAuthAttribute(AccessLevel=MyPermissionLevel.Modify)]
意味着您使用无参数构造函数,并将值并行分配给名为
AccessLevel
的属性

相反,您应该为参数提供一个值。 您可以通过简单地提供值或使用命名参数表单
(parameter_name+':')
来实现这一点