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

Why Does Named Parameter For A Custom Attribute Require `:` Syntax?

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

[AttributeUsage(AttributeTargets.All)]
public class CustomAuthAttribute : AuthorizeAttribute
{
    private MyPermissionLevels requestedAccessLevel;

    public CustomAuthAttribute(object AccessLevel = null)
    {
        AccessLevel = AccessLevel ?? MyPermissionLevels.View;            
        if(AccessLevel.GetType() != typeof(MyPermissionLevels))
        {
            throw new ArgumentException("AccessLevel is invalid.");
        }
        this.requestedAccessLevel = (MyPermissionLevels)AccessLevel;
    }

        ... // Other Auth Stuff
}

当我将此属性应用于控制器时,例如,[CustomAuthAttribute (AccessLevel = MyPermissionLevels.Modify)] intellisense 抱怨:

The type or namespace name 'AccessLevel' could not be found. (etc?)

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

Change 'AccessLevel' to 'AccessLevel:'

添加此冒号(并暗示删除 = 运算符,这不是建议修复的自动部分)确实解决了编译错误。

如果仅此而已,我可以使用不同的语法。但是,我想了解我做了什么阻止我使用更常见的属性 field-initialization 语法 ,如 Named parameters confusion 的答案中所述,并且可以完成 parent class:

[Authorize(Roles = "Modifiers")]

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

父class有一个public属性Roles,所以在行中:

[Authorize(Roles = "Modifiers")]

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

[CustomAuthAttribute (MyPermissionLevels.Modify)]应该没问题。

形式 [CustomAuthAttribute (AccessLevel = MyPermissionLevels.Modify)] 意味着您使用无参数构造函数并并行地为名为 AccessLevel.

的 属性 赋值

相反,您应该为参数提供一个值。 您可以通过简单地提供值或使用命名参数形式 (parameter_name + ':').

来完成此操作