是否可以更改函数的返回类型

时间:2011-05-11 19:41:36

标签: c# return-type

是否可以使用一个函数(int n,bool wantall)并根据bool返回不同的类型? 让我想到这一点的例子是产生斐波那契数字。 如果wantall = true,则返回前n个数字的数组(或列表),否则返回第n个数字。 有没有办法做到这一点?

7 个答案:

答案 0 :(得分:10)

不,您无法更改返回类型。

对于您的示例,理想情况下,您应该针对所讨论的内容进行不同的重载

GetFirstFibonacciNumbers(int count)
GetSingleFibonacciNumber(int nth)

为此传递bool只是丑陋。

但如果你坚持使用单一方法

IEnumerable<int> GetFibonacciNumbers(int n, bool wantall) {
    if(!wantall) {
        return new[] { GetSingleFibonacciNumber(n); }
    }
    else {
        return GetFirstFibonacciNumbers(n);
    }
}

但是,请不要这样做。

答案 1 :(得分:2)

public Object foo(int n, bool wantall)
{
    // you can return whatever you want
}

答案 2 :(得分:0)

您可以返回object或其他所有可能的返回类型继承的类型,但除此之外,您无法动态更改返回类型。

答案 3 :(得分:0)

不确定。返回一个object或一个提供枚举的包装器,它会提示您实际在对象内部。

答案 4 :(得分:0)

您可以使用dynamic返回类型

答案 5 :(得分:0)

不,方法契约是在编译时定义的,不能在运行时更改。

一种选择是返回一个对象类型,但在这种情况下使用对象类型通常被认为是非类型安全的,所以最好的做法是避免使用它。

我看到了几种处理方式: -

  1. 始终返回一个数组,但只有一个项目填充它,如果wantall = false。
  2. 对单个值和值数组使用单独的方法。

答案 6 :(得分:0)

正如Jason所提到的,使用bool作为你的具体例子并不是一个好主意。但是,使用Generics这个问题真是没有意义:例如(使用您的具体示例)

public List<int> FibSequence(int i, int? n)
{
    List<int> fibSeq = new List<int>();
    //Calculate fib sequence
    if(n != null)
    {
       return new List<int>() { fibSeq[n] };
    }
    return fibSeq;
}

同样,为了这个特殊的目的,它并不是很好,但是当“All”结果只是1时,我必须得到“全部X”的次数相当多(这将会降低可空的int参数,但代码本身非常相似)。然后你的代码只处理返回的通用列表,并考虑它是否有多个元素。