【问题标题】:Default value for attribute constructor?属性构造函数的默认值?
【发布时间】:2010-08-09 01:35:38
【问题描述】:

我收到了这个错误,

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

当我尝试写这样的东西时

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

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

实际上,只有当我提供默认值并且像这样依赖它(即我省略它)时,才会发生错误both

    [Url("/index")]

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

【问题讨论】:

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

标签: c# attributes


【解决方案1】:

我正在调用“错误”。

希望您不要介意,我已向 Microsoft 报告了该错误。

更新:

我今天收到了来自 Microsoft 的以下反馈,强调了。

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

我们已经修复了可选字符串 我们代码中的属性参数。 您会在 VS 2010 之后的 Visual Studio。

亚历克斯·特纳

项目经理

Visual Basic 和 C# 编译器

【讨论】:

  • 完全不介意。不过,当我点击该链接时,我得到了 404。它要求我登录,然后说找不到该页面。
  • @Mark:奇怪。我刚试了一下,效果很好。也许这是一个权限的事情。我会及时向大家发布。我确实收到了一封自动确认信,表明它正在被发送到正确的团队。我们会看看会发生什么。
  • 它确实提到了权限——“找不到您请求的内容,或者您​​没有查看它的权限。”可能就是这样。
  • 嗯。有趣的是,他们给了 404 而不是 401,嗯?
  • 嗯.. 我只是说“404”,因为它说“找不到页面”*跑去检查标题*它实际上发送了 500。
【解决方案2】:

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

【讨论】:

  • 这不是问题:) 但“为什么”的原因是因为 C# 4 添加了命名参数。有了属性,我们现在似乎有两种方法来定义命名参数,但我们没有,因为这种方法会引发错误;我试图通过坚持一种方法来保持应用程序的一致性。尽管如此,我并不是说添加默认参数是个好主意,我只是想知道为什么我们不能。
  • 这可能是一个错误,但我认为这并不重要,因为已经有更好的方法可以做到这一点。抱歉,C# 不是完全正交的。
  • 对我来说这绝对是一个错误。你可以用属性的定义编译代码,但是任何使用它的代码都无法编译。
猜你喜欢
  • 2018-11-03
  • 2017-08-28
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2016-07-23
  • 2013-03-16
相关资源
最近更新 更多