我只是想知道......为什么C#不允许多个返回值?
目前我们通过返回课程或使用def reverser(&block)
block.call.reverse
end
irb(main):009:0> result = reverser do
irb(main):010:1* "hello"
irb(main):011:1> end
=> "olleh"
表达了返回多个值的意图 - 如下所示。
out
上面的代码可以用不同的方式表达:
static void Check(MyTask task )
{
if (GoodReasonsNotTo(task))
{
throw new ApplicationException("There are good reasons not to do this.");
}
}
public static int UglyDo( MyTask task, out string response )
{
Check(task);
//...
response = "Done";
return 7;
}
static void Main(string[] args)
{
var task = new MyTask("Add multiple return values");
string response;
var err = UglyDo(task, out reponse));
}
返回值与函数参数有什么特别之处吗?看起来一样,他们做同样的事情。他们为什么不平等?
此外,未来可以支持吗?
顺便说一句。 StackOverflow的语法高亮显示器可以很好地处理它 - 这肯定意味着它会是一件好事。
答案 0 :(得分:8)
有趣的是你问。刚刚宣布它will be supported in C# 7.0 [MSDN]
答案 1 :(得分:3)
好问题。这实际上目前由一些高级语言(如Go)以及至少一些汇编语言(如MIPS)支持,其中reserves several registers用于参数,两个用于返回值(但这至少部分是惯例而不是寄存器之间的一些实际物理差异)。从更普遍的意义上说,没有什么特别的东西,特别是#34;关于返回值。
就Cx尚未直接支持的原因而言,我在这里进行了一些推测,但C#仍然主要面向面向对象的开发。甚至像匿名功能这样的功能也被实现了#34;引擎盖下#34;以面向对象的方式,所以我怀疑如果他们最终做了类似多次返回值的事情,那么它也基本上是用于创建和返回对象的语法糖。所以,基本上,你现在明确地返回一个对象,也许将来它会隐式返回一个。
编辑:现在我们得到多个返回值的最接近的可能就是Tuples,不幸的是,它现在在C#中的语法非常不方便(它们在其他方面使用起来更加方便.NET语言,尤其是F#,我非常希望看到它更加突出,但我认为这只是我的看法。显然他们正在考虑在未来版本的C#中改进它,这可能会像我们一段时间内得到的那样接近(我认为这与我怀疑他们所做的一切无关)多个返回值只是对象的语法糖。
答案 2 :(得分:1)
我仍然是C#的新手,但这样的解决方法不会对你有帮助吗? 使用所需的参数创建一个新类,并创建一个返回该类的函数。
public static testClass PrettyDo(MyTask task)
{
Check(task);
//...
testClass answer = new testClass();
answer.param1 = 7;
answer.param2 = "Done.";
return answer;
}
public class testClass
{
public int param1 { get; set; }
public string param2 { get; set; }
}
答案 3 :(得分:1)
如何使用Tuple
:
public static Tuple<int, string> PrettyDo(MyTask task)
{
Check(task);
//...
return Tuple.Create(7, "Done.");
}
static void Main(string[] args)
{
var task = new MyTask("Add multiple return values");
var result = PrettyDo(task);
var err = result.Item1;
var response = result.Item2;
}
它不像某些更高级别的语言那样支持解包,但它非常接近你所追求的目标。