【问题标题】:Optional Parameters, mixed with Out in a method signature可选参数,在方法签名中与 Out 混合
【发布时间】:2011-04-26 09:32:30
【问题描述】:

我正在用一些带有命名参数和可选参数的方法替换一系列方法重载。

虽然这没有造成任何问题,但我发现在使用“out”时有一个扳手在工作。

例如

如果我打电话:

 foo(int a, out int b, int c = -1, string d = "")

编译器会抛出一个错误,因为无论何时我调用此方法,它都不会看到它或将其识别为该方法的相关签名。

我意识到任何可选参数都必须在强制参数之后 -> 对于带有“out”的参数是否有任何此类规则,或者我是否遗漏了任何明显的东西?

【问题讨论】:

  • 您使用的是什么版本的 Visual Studio(或框架)?这些功能是在 2010 年才添加的。
  • foo(int a, out int b, int c = -1, string d = "") 在我看来不是一个有效的方法定义,而且它肯定不是一个有效的调用。您如何向我们展示您的真实代码?... 编辑:啊,这是新的 .NET4/VS2010 语法。我还没有享受到乐趣......我们仍在从 1.1 升级到 2.0 ;-)
  • @corlettk -> 正确的@Nick vs 2010/.net4
  • 我刚刚下载完 VS2010TrainingKitMarch2011.Setup.exe 我认为微软产品在 SP1 发布后变得“足够稳定,可以使用”;-)

标签: c# overloading optional-parameters out


【解决方案1】:

如果您的意思是调用根据示例定义的方法,那么只需(例如):

int x;
foo(123, out x, d: "hi");

out 参数不能是可选的(这意味着它必须出现在可选参数之前),但可以在任何地方指定(作为命名参数) - 例如:

int x;
foo(b: out x, a: 123);

如果您希望b 是可选的,则需要重载:

void foo(int a, int c = -1, string d = "")
{
    int b;
    foo(a, out b, c, d);
}

现在你可以打电话了:

foo(123, d: "hi");

【讨论】:

  • 我的格式和你的一样?但是我发现如果我有两种方法(一种是另一种的重载),例如foo(int a, out int b, int c = -1, string d = "") 和 foo(int a, out int b, int c) 那么如果我尝试使用可选参数调用该方法,例如:int x = 富(4,5);编译器会抛出一个错误并指向重载(没有可选参数的那个)并告诉我我缺少 c....
  • @templater foo(4,5) 在这里工作正常;如果你有一个不工作的特定对,发布它们...
  • 我遇到问题的特定对组合是: int DoSomethingReturnValue(Exception a, out string b, int c = -1, int d = -1, int e = -1, object[ ] f = null, string g = "") & int DoSomethingReturnValue(Exception a, int c, int d, int e, out string b).任何时候我都会打电话说,int returnedValue = DoSomethingReturnValue(ex, out desc); - 编译器将忽略带有可选参数的版本,只通知我 DoSomethingReturnValue 没有带 2 个参数的重载,指向没有可选参数的重载....
  • @templater - 在这里编译得很好......但我有实验性的 C# 5 编译器(来自 Async CTP 刷新)。你确定两个版本都有返回值吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多