【问题标题】:What is the difference between Default and [Optional] Parameters?默认参数和 [可选] 参数有什么区别?
【发布时间】:2014-02-25 02:38:10
【问题描述】:

有什么区别

Method(int arg0 = 0) vs Method([Optional] int arg0 = 0);

每当我试图调用这个方法时,编译器都会说它的模棱两可的情况。我知道为什么这是模棱两可的情况,我的兴趣是如果它们促进相同的事物 = 可选参数,那两者之间有什么区别。然而,他们以不同的方式这样做,在视觉上列出 - 不知道引擎盖下的情况。

有人向我指出,第一种方式实际上是为 DEFAULT 使用的,这意味着您将初始化默认值,而第二种方式是 OPTIONAL,它在您不定义任何默认值的情况下使用 - 虽然它是有道理的,但是它们两者都可以很容易地分配值而不是。它们的真正区别和用途是什么?

【问题讨论】:

  • Method([Optional] int arg0 = 0) 是如何编译的? 编辑 [System.Runtime.InteropServices.Optional],我认为它是多余的。
  • OptionalAttribute 从 .NET 1.1 开始就在我们身边。 C# 特别不支持可选参数的事实是另一回事 - 它在 VB.NET 中占有一席之地。当 C# 4.0 也添加了可选参数时,它对同一件事使用了简化的语法。

标签: c#


【解决方案1】:

基本上,当您指定可选参数时,编译器会自动应用OptionalAttribute。 (这有点像为扩展方法提供ExtensionAttribute。)

在 IL 中,它看起来不像其他属性 - 它只是在参数前有 [opt]

我建议您不要自己明确指定 - 改用语言提供的机制。

请注意,您也可以使用DefaultParameterValueAttribute 指定默认值。所以这两个声明是等价的:

void Foo(int x = 5)
void Foo([Optional, DefaultParameterValue(5)] int x = 5)

这些属性存在的事实允许不明确支持它们的语言仍然表达它们 - 例如,您可以编写一个 C# 2 程序,该程序公开带有可选参数的方法以供在 VB 中使用。

【讨论】:

  • 当你用不同的值指定属性和语言结构时会发生什么? (我手头没有编译器)
  • @M.Mimpen:编译器不会让你这么做。 (错误 CS1745。)
  • 我犹豫要纠正 Jon Skeet,但在您的代码块中,您似乎缺少右括号。
  • 在第二个选项中,我没有看到任何地方声明的参数 type。如果这是正确的,那是我以前从未见过的。
  • @Xynariz:不,更多的错字:)
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 2013-07-24
  • 1970-01-01
  • 2020-05-25
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多