可选的输出参数

在C#4中,是否有一个好的方法来有一个可选的输出参数?

不是真的,虽然你总是可以重载方法与另一个不采取输出参数。

使用OptionalAttribute装饰参数也不起作用。 为了扩展以前的样本,你会得到像这样的东西:

 private void Func( [Optional] out int optional1, [Optional] out string optional2) { /* ... */ } 

请注意,以上将编译(也许不幸)。 但是,试图编译:

 Func(out i); 

将会失败,除非明确提供了带有单参数签名的重载。

(理论上)使上述工作成为一个重大问题。 当一个带有省略的可选参数的方法被调用时,一个包含所有参数值的堆栈框架被创build,并且缺less的值被简单地用指定的缺省值填充。

但是,“out”参数是一个参考,而不是一个值。 如果该参数是可选的并且没有提供,它会引用哪个variables? 编译器仍然需要强制执行这样的要求,即在任何正常的方法返回之前填充“out”参数,因为编译器事先并不知道调用者指定了哪个(如果有的话)可选参数。 这意味着对某个地方的虚拟variables的引用将被传递,所以该方法有一些东西需要填充。 pipe理这个虚拟variables空间会给编译器的编写者造成一个讨厌的头痛。 我并不是说要搞清楚这个方法的细节是不可能的,但是微软可以理解的是,这个架构的意义已经足够了。

没有。

为了使其成为“可选”,从您不需要在方法中指定值的意义上说,您可以使用ref

 private object[] Func(); 

在返回对象数组中指定任意数量的输出,然后使用它们! 但如果你的意思是可选的输出类似

 private void Func(out int optional1, out string optional2) 

然后你打电话像

 Func(out i); 

那么答案是不可以的。 另外C#和.NET框架还有许多像ListArray这样非常灵活的数据结构,您可以将它们用作输出参数或返回types,因此不需要实现具有可选输出参数的方法。

 public class Dummy<T> { public T Value; } 

然后使用functionDoSomething(out new Dummy<int>().Value ,其中int可以是任何types。