2

为什么下面的代码会给我异常:

CSC 错误 CS0182:属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式

在我的构建服务器上?

/// Customer.cs...

[Search(SearchAttribute.SearchDisplay.Regular)] 
public Category Category
{
     get; set;
}

public enum Category : byte
{
    X = 0x01,
    Y = 0x02,
    ...
}

/// SearchAttribute.cs...

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SearchAttribute : Attribute
{
    public SearchDisplay Display { get; private set; }

    public enum SearchDisplay
    {
        None = (byte) 0x01,
        Regular = (byte) 0x02
    }

    public SearchAttribute(SearchDisplay display, string columnName = null)
        : base()
    {
        Display = display;
    }
}

非常感谢。

令人生气的是,它在 VS2012 中构建良好。我不确定服务器上运行的是什么版本的编译器——但我很确定它不是 2012 版本的。

更新

感谢下面的回答者,我已经弄清楚了:

我使用的是 VS2012,但构建服务器仍在使用 VS2010 构建过程。当在属性中使用空值默认参数时,VS2010 / C#4 编译器中存在一个错误。我可以通过以下三种方式解决:

  1. 不要使用默认参数 -public SearchAttribute(SearchDisplay display, string columnName)
  2. 使用空字符串 - public SearchAttribute(SearchDisplay display, string columnName = "")
  3. 更新我的构建服务器。

我现在和2一起去。3 是我需要在其他时间考虑的事情。

4

2 回答 2

3

我认为该Customer.cs文件位于一个单独的程序集(C# 项目)中,并且该程序集引用了所在的程序集(项目)SearchAttribute.cs

为了使构造函数中的枚举SearchDisplay和可选参数正常工作,以正确的顺序重新编译两个columnName程序集至关重要。我怀疑您的构建服务器不是这种情况。依赖程序集可能是使用对所在程序集的旧版本的引用进行编译的。SearchAttribute

更新

查看右侧的所有链接线程。这是一个他们说在 Visual Studio 2012(C# 5 编译器)中修复的错误。仅当可选参数的默认值为 时才会发生null。在我的第一个测试中,我做出了使用另一个字符串(可以识别)的愚蠢决定,但它不会发生在另一个字符串上。(将在下面删除我的评论。)

当属性的使用与属性类本身在同一个程序集中时,它有助于为null文字提供显式类型,如下所示:

public SearchAttribute(SearchDisplay display, string columnName = (string)null)
...

有了这个,只要所有用法都与上述构造函数在同一个程序集中,它似乎就可以工作。但是,在您的情况下,它们位于不同的程序集中。

如果您愿意使用空字符串,问题就会消失:

public SearchAttribute(SearchDisplay display, string columnName = "")
...

否则,我建议您使用旧的 pre-C#-4 样式

[Search(SearchAttribute.SearchDisplay.Regular)] 
public Category Category
...

[Search(SearchAttribute.SearchDisplay.Regular, ColumnName = "Changed!")] 
public Category AnotherCategory
...

columnName只要有一个类成员(实例属性或字段)称为ColumnName. 这ColumnName不能是只读的或只读的。

于 2013-04-08T16:18:30.667 回答
1

你不是说

 [Search(SearchAttribute.SearchDisplay.Regular)] 
于 2013-04-08T16:02:13.783 回答