【问题标题】:Why do optional parameters in C# 4.0 require compile-time constants?为什么 C# 4.0 中的可选参数需要编译时常量?
【发布时间】:2011-03-18 00:11:07
【问题描述】:

还有没有办法为可选方法参数使用运行时值?

【问题讨论】:

标签: c# .net optional-parameters


【解决方案1】:

可选参数必须是常量,因为它们被写为属性的值。因此,它们继承了属性值具有的所有限制。

无法直接对运行时值进行编码。但是,您可以使用以下模式接近

public void MyApi(SomeType type = null) {
  type = type ?? new SomeType();
  ...
}

【讨论】:

  • 谢谢,这似乎是一个巧妙的技巧。出于好奇,你知道为什么它们是使用属性来实现的吗?我假设重用框架中已有的内容?
  • @Joan IIRC 它是用属性完成的,因为其他语言(VB.Net)就是这样做的,因此它提供了与它们的兼容性。
  • @Joan:通过使用属性,它们不会破坏没有此功能的语言。请记住,.NET 中的所有内容都被编译成需要与语言无关的形式......属性是一种处理特定语言中可选参数的简洁方法,无需对其他 .NET 语言进行重大更改。
  • @Joan:这将需要更改 CLR 以支持此功能 - 他们这样做的方式,它匹配现有的 VB 实现,对其他语言没有影响,并且“正常工作”.. .
  • 是的,我就是这个意思。那讲得通。他们只是选择了当时最简单的路线。
【解决方案2】:

可选参数被编译到程序集中,因此(就像指定为 const 的任何参数一样)它们必须是编译时常量。

不,您不能将执行时值用作可选参数。

【讨论】:

  • 谢谢,但它不能通过引用运行时引用来编译吗?所以说类似:this.Filename等在同一个类中?
【解决方案3】:

可选参数在编译时确定,如果调用参数太少的方法,则将其替换到方法中。它们是通过向方法的 IL 中的参数添加属性来处理的。

因此,它们需要在编译时完全解析(既用于创建,因为它们是属性,也用于使用时)。无法将运行时值用于可选方法参数。

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2016-07-27
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多