簡體   English   中英

是否可以更改函數的返回類型

[英]Is it possible to change the return type of a function

是否有可能采用(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 ,或者提供一個枚舉的包裝器,該枚舉可向您提示對象內部的實際內容。

您可以使用動態返回類型

不可以,方法協定是在編譯時定義的,不能在運行時更改。

一種選擇是返回對象類型,但是在這種情況下使用該對象類型通常被認為是非類型安全的,因此最佳實踐是避免這種情況。

我看到幾種解決方法:-

  1. 始終返回一個數組,但如果wantall = false,則僅填充一項。
  2. 對單個值和值數組使用單獨的方法。

正如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 of X”時,“ All”只變成了1(這將刪除可為空的int參數,但是代碼本身非常相似)。 然后,您的代碼只處理返回的通用列表,並考慮它是否包含多個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM