是否可以更改函数的返回类型
本文关键字:函数 返回类型 是否 | 更新日期: 2023-09-27 17:56:14
是否有可能有一个函数来获取(int n,bool wantall)并根据布尔值返回不同的类型?让我思考这个问题的例子是生成斐波那契数。如果 wantall = true,则返回前 n 个数字的数组(或列表),否则,只需返回第 n 个数字。有没有办法做到这一点?
不可以,您无法更改返回类型。
对于您的示例,理想情况下,您应该对所谈论的内容有不同的重载
GetFirstFibonacciNumbers(int count)
GetSingleFibonacciNumber(int nth)
为此通过bool
只是丑陋的。
但是,如果您坚持使用一种方法
IEnumerable<int> GetFibonacciNumbers(int n, bool wantall) {
if(!wantall) {
return new[] { GetSingleFibonacciNumber(n); }
}
else {
return GetFirstFibonacciNumbers(n);
}
}
但是,请不要这样做。
public Object foo(int n, bool wantall)
{
// you can return whatever you want
}
您可以返回所有可能的返回类型继承的object
或某种其他类型的类型,但除此之外,您无法即时更改返回类型。
当然。返回一个object
,或者一个包装器,它提供了一个枚举,提示你了解对象内部的实际内容。
您可以使用动态返回类型
否,方法协定在编译时定义,不能在运行时更改。
一种选择是返回对象类型,但在这种情况下使用该对象类型通常被认为是非类型安全的,因此最佳做法是避免它。
我看到几种处理这个问题的方法:--
- 始终返回一个数组,但如果 wantall=false,则只用一个项目填充它。
- 对单个值和值数组使用单独的方法。
正如 Jason 提到的,将 bool 用于您的特定示例不是一个好主意。 但是,使用泛型时这个问题确实没有实际意义:例如(使用您的特定示例)
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 时,我不得不获得"All of X"(这将删除可空的 int 参数,但代码本身非常相似)。 然后,您的代码只处理返回的泛型列表,并考虑它是否具有多个元素。