为什么c#不允许多个返回值?

时间:2016-08-25 03:47:14

标签: c#

我只是想知道......为什么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的语法高亮显示器可以很好地处理它 - 这肯定意味着它会是一件好事。

4 个答案:

答案 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;
}

它不像某些更高级别的语言那样支持解包,但它非常接近你所追求的目标。