c# - 在属性构造函数中使用可选参数时,属性参数必须是常量错误

标签 c# .net visual-studio-2010

谁能解释为什么这段代码有效:

public class AdministratorSettingValidationAttribute : Attribute
{
    public AdministratorSettingValidationAttribute(AdministratorSettingDataType administratorSettingDataType)
    {
        DataType = administratorSettingDataType;
    }

    public AdministratorSettingValidationAttribute(AdministratorSettingDataType administratorSettingDataType, Type enumerationType)
    {
        DataType = administratorSettingDataType;
        EnumerationType = enumerationType;
    }
}

...但将其重构为使用可选参数:

    public AdministratorSettingValidationAttribute(AdministratorSettingDataType administratorSettingDataType, Type enumerationType = null)
    {
        DataType = administratorSettingDataType;
        EnumerationType = enumerationType;
    }

...导致编译时错误: "属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式"。

最佳答案

更新

该错误于去年 7 月报告,现已修复。该修复程序将出现在下一版本的 C# 中。有关详细信息,请参阅此连接反馈项目:

http://connect.microsoft.com/VisualStudio/feedback/details/574497/optional-parameter-of-type-string-in-a-attribute-constructor-cannot-be-null


这显然是一个编译器错误。感谢您提请我注意。

这里应该发生的是,编译器应该意识到可选值表达式被隐式转换为形式参数类型,然后将表达式视为该类型的常量表达式。它实际做的是将表达式视为无类型空文字,这是错误的。

您可以通过将常量转换为明确类型的常量来解决该错误:

public AdministratorSettingValidationAttribute(AdministratorSettingDataType administratorSettingDataType, Type enumerationType = (Type)null) 

修复可能很简单,但我不能保证会在下一版本的 C# 中修复;我不确定此时进行非关键错误修复的时间表是怎样的。

再次感谢,对于给您带来的不便,我们深表歉意。

关于c# - 在属性构造函数中使用可选参数时,属性参数必须是常量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8290853/

相关文章:

c# - 如何在表达式树中编写 string.Contains(someText)

.net - 温莎城堡 transient 一次性用品

.net - DateTime 的 WebApi 序列化 - 如何反序列化?

javascript - 使用 javascript 函数从 asp.net 页面重定向到另一个页面

c++ - 将Qt4移植到Qt5,为OpenGL调用获取未解析的外部符号

c# - Visual Studio 单元测试 Assert.AreEqual 因预期值和实际值相同而失败

c# - 移动刚体游戏对象的正确方法

c# - C# 中 C++ 的等效数据类型

c# - IE10 Chakra JScript 引擎是否可以从 C# 独立访问?

c# - 使用相同泛型类型的另一个依赖项注册装饰器