属性参数必须是一个常量表达式。

3

请问有人可以解释一下为什么以下界面定义在Visual Studio 2010中编译时会出现错误吗?

   [IncompleteCodePort(SourceOriginType.Other, "This should be a GL abstraction depending on what OpenGL API will be used")]
    public interface IGL
    {
        /// <summary>
        /// Returns true if provided function is available or supported by graphics API
        /// </summary>
        /// <param name="funcName"></param>
        /// <returns></returns>
        bool IsFunctionAvailable(string funcName);

        /// <summary>
        /// Returns true if provided function is supported as extension by graphics API
        /// </summary>
        /// <param name="funcName"></param>
        /// <returns></returns>
        bool IsExtensionAvailable(string funcName);
    }



public class IncompleteCodePortAttribute : Attribute
    {
        public SourceOriginType SourceOriginType { get; private set; }
        public string SourceUrl { get; private set; }
        public string Reason { get; private set; }


        public IncompleteCodePortAttribute(SourceOriginType originType, string reason, string sourceUrl = null)
        {
            SourceOriginType = originType;
            SourceUrl = sourceUrl;
            Reason = reason;
        }
    }

    public enum SourceOriginType
    {
        CodePlex,
        WorldWindJdk,
        StackOverflow,
        Other
    }

我收到的错误信息是:

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

如果我删除自定义属性,则不会出现编译错误。

1
什么是IncompleteCodePort?请列出它的所有构造函数。 - Nawaz
我能够使用虚拟的IncompleteCodePort类进行编译。我认为您在这里缺少一些信息。 - Manish
如果你正在IncompleteCodePort类中使用枚举,请不要这样做。请改用SourceOriginType - Corey
我的错。我发帖太晚了。我已经添加了IncompleteCodePortAttribute的定义。 - Klaus Nji
我收回之前说的话,似乎这段代码在VS2010下实际上并不能编译通过(但在VS2012下可以)。 - svick
1
这是C#编译器的一个bug。已经修复。请参见https://dev59.com/c2sy5IYBdhLWcg3w0RbT。 - Jonathan Moffatt
1个回答

2

这似乎是VS2010中C#编译器的一个bug(在VS2012下,代码可以正常编译)。看起来编译器没有将参数默认值中的null视为常量。

以下代码无法编译:

[IncompleteCodePort()]
interface IGL
{}

class IncompleteCodePortAttribute : Attribute
{
    public IncompleteCodePortAttribute(string sourceUrl = null)
    {}
}

提到了错误消息 ("An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type"),但是没有源代码位置,这可能会让人感到困惑。

下面是一些声明属性的例子,它们可以正常工作:

class IncompleteCodePortAttribute : Attribute
{
    public IncompleteCodePortAttribute(string sourceUrl = "")
    {}
}

class IncompleteCodePortAttribute : Attribute
{
    private const string Null = null;

    public IncompleteCodePortAttribute(string sourceUrl = Null)
    {}
}

class IncompleteCodePortAttribute : Attribute
{
    public IncompleteCodePortAttribute()
        : this(null)
    {}

    public IncompleteCodePortAttribute(string sourceUrl)
    {}
}

谢谢。奇怪的是,我在VS2012中打开了解决方案,然后回到VS2010重新加载,现在它可以编译了。 - Klaus Nji
它以前可以编译,现在不行了。我刚刚删除了可选的构造函数参数并重载了构造函数。谢谢。 - Klaus Nji
1
请访问https://dev59.com/c2sy5IYBdhLWcg3w0RbT。 - Jonathan Moffatt
很高兴知道我们将获得一个带有修复程序的服务包...哦等等。 - Sellorio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接