2011-05-11 101 views
0

是否有可能有一個函數需要(int n,bool wantall)並返回基於bool的不同類型? 讓我想到這個例子的例子是生成斐波那契數。 如果wantall = true,則返回前n個數字的數組(或列表),否則,返回第n個數字。 有沒有辦法做到這一點?是否有可能改變函數的返回類型

+0

您可以使用自定義返回類型,如「FibonacciResult」,其中包含列表和單個數字結果的屬性。但我同意下面的帖子,這不是一個好主意。 – mellamokb 2011-05-11 19:44:28

+0

*「如果wantall = true,則返回前n個數字的數組(或列表),否則,返回第n個數字。有沒有辦法做到這一點?」 - 對不起,這只是一個糟糕的設計不應該在實踐中使用。最好有兩個方法,'GetFibs(int count)'和'GetNthFib(int n)'。 – Juliet 2011-05-11 19:46:15

回答

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); 
    } 
} 

但是,請不要這麼做。

0

您可以返回object或其他所有可能的返回類型繼承的類型,但除此之外,您不能即時更改返回類型。

0

當然。返回一個object,或者提供一個枚舉的包裝器,它可以讓你知道實際內部對象的內容。

0

你可以使用一個dynamic返回類型

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

沒有,方法合同在編譯時定義,並且不能在運行時改變。

一個選項將返回一個對象類型,但使用在這種情況下的對象類型通常被認爲是未類型安全的,所以最好的做法是避免它..

我看到了一些處理這個問題的方法: -

  1. 總是返回一個數組,但只有在使用ifall = false時才填充一個數組。
  2. 對單個值和值數組使用單獨的方法。
0

正如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時(這會拋出可爲空的int參數,但代碼本身非常相似),「All of X」。然後你的代碼只處理返回的通用列表,並考慮它是否有多個元素。

+0

我也可以將它設置爲數組的第一個元素,但那不是真正的要點 – soandos 2011-05-11 19:55:16

相關問題