簡體   English   中英

參數:(必需,可選)vs(必需,必需,可選)

[英]Parameters: (required, optional) vs (required, required, optional)

我已經定義了以下方法:

void Write(string fileContent, string fileName, string container = StorageBlobContainers.ProfilePictures)

編譯的代碼沒有問題,所以我編寫了代碼來執行它(來自不同的文件):

string json = JsonConvert.SerializeXNode(node);
FileProcessor.Write(json, "productscontainer");

但似乎由於某種原因它什么也沒做。
經過幾分鍾的努力才能理解這個問題,我終於找到了它。 在同一個類的某個地方,已經有一個像這樣定義的Write函數:

void Write(string filePath, string container = StorageBlobContainers.ProfilePictures)
{
  if (!File.Exists(filePath))
    return string.Empty;
  ...

這真的讓我很困惑,因為它編譯得很好,當然,它有意義,因為一個方法有3個參數簽名而另一個有2個,但這不是很模糊和/或容易出錯嗎? 對我來說,似乎沒有一種方法是“合乎邏輯的”選擇方法。 為什么選擇第二個而不是另一個?

是的,方法解析可能很棘手,因此在編寫多個重載時請務必記住。 他們現在不應該對你不明確。 編譯器剛剛選擇了最短的匹配,這完全是應該的,因為它記錄了這樣做。

你可以做兩件事:

  • 重命名其中一種方法。 對於您和編譯器而言,這將使方法解決變得輕而易舉,並且絕對清晰。
  • 制作兩者所需的最后一個參數。 這將使方法分辨率再次非常清晰:在兩個對三個參數上。

它是指定的(在重載決議中, C#規范的第7.5.3節):

7.5.3.2更好的功能成員

為了確定更好的函數成員,構造一個精簡的參數列表A,它按照它們在原始參數列表中出現的順序僅包含參數表達式本身。 每個候選函數成員的參數列表按以下方式構造:

•如果函數成員僅適用於展開的表單,則使用展開的表單。

從參數列表中刪除沒有相應參數的可選參數

•重新排序參數,使它們出現在與參數列表中相應參數相同的位置。

(......)

•否則,如果M P的所有參數都具有相應的參數,而默認參數需要替換M Q中的至少一個可選參數,則M P優於M Q.

(等等。)

所以在你的情況下, 帶有參數的可選參數會在重載決策中被考慮在內,所以第二個(帶有可選參數),更具體地匹配你的調用(有兩個參數)而不是你期望的那個(有三個) ,所以它被認為是“更好”

在C#規范中(取決於可能更改的版本),第1.6.6.5節處理方法重載。 此外,這個問題與您使用可選參數詢問OVerload的問題相同,該參數鏈接到以下MSDN文章MSDN

其中包含相關部分

如果判斷兩個候選者同樣好,則優先選擇沒有可選參數的候選者,該參數在調用中被省略。 這是對具有較少參數的候選者的重載分辨率的一般偏好的結果。

暫無
暫無

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

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