[英]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.
(等等。)
所以在你的情況下, 帶有參數的可選參數會在重載決策中被考慮在內,所以第二個(帶有可選參數),更具體地匹配你的調用(有兩個參數)而不是你期望的那個(有三個) ,所以它被認為是“更好”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.