问题 属性构造函数的默认值?


我收到这个错误,

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

当我尝试写这样的东西时

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class UrlAttribute : Attribute
{
    public UrlAttribute(string pattern, string name=null)
    {
        // ...

它甚至没有显示行号,但是当我取出它时它就消失了 =null 位。

实际上,只会发生错误  当我提供默认值时  如此依赖它(即我省略它)

    [Url("/index")]

我很想知道为什么会这样? “null”如何不是常量表达式?


8999
2017-08-09 01:35


起源

我收到了Microsoft的反馈,并相应地更新了我的回复。 - kbrimington
@kbrimington:感谢您的更新!听起来我们必须等待修复程序发布之前......哦,这几乎不是关键:) - mpen
object name = null也会出现此错误。 - ghord
从Visual Studio 2012 Update 3开始,正在构建.net 4.0项目 - 此问题仍然存在。 - Brent Arias
VS 2013中仍然存在此错误 - j_maly


答案:


我叫'虫'。

我希望你不介意,我向微软报告了这个错误。

更新:

我今天收到了微软的以下反馈,重点补充说。

感谢您报告此问题   遇到Visual Studio!

我们修复了可选字符串   我们代码中属性的参数。    您将在版本中看到此修复程序   VS 2010之后的Visual Studio。

亚历克斯特纳

项目经理

Visual Basic和C#编译器


9
2017-08-09 04:45



不要介意。当我关注该链接时,我得到了404。它让我登录,然后说找不到页面。 - mpen
@Mark:奇怪。我只是尝试了它,它工作得很好。也许这是权限的事情。我会及时向大家发布。我确实收到了一封自动确认信,表明它已被发送给合适的团队。我们会看到会发生什么。 - kbrimington
它确实提到了权限 - “您请求的内容无法找到,或者您无权查看它。”这可能是它。 - mpen
呵呵。有意思的是,他们给了404而不是401,那么,呃? - kbrimington
嗯..我只是说“404”,因为它说“找不到页面”*跑掉来检查标题*它实际上发送了500。 - mpen


属性已经提供了默认参数。您只需在属性上创建公共属性,然后可以在属性实例化过程中分配这些属性。它已经有效,它已经很好理解,并且与框架属性的工作方式一致。那么......为什么不使用该机制而不是尝试冗余地向构造函数添加默认参数?


1
2017-08-09 05:11



这不是问题:)但“原因”的原因是因为C#4添加了命名参数。有了属性,我们现在似乎已经拥有了 二 定义命名参数的方法,除了我们不这样做,因为这会引发错误;我试图通过坚持一种方法来保持应用程序的一致性。不过,我并不是说添加默认args是个好主意,我只是想知道 为什么 我们不能。 - mpen
这可能是一个错误,但我不认为它是至关重要的,因为已经有更好的方法来做到这一点。抱歉,C#不完全正交。 - siride
对我来说,这绝对是一个错误。您可以使用属性的定义编译代码,但无论使用它的任何代码都无法编译。 - user276648