2010-02-10 35 views
2

我有一種感覺,這個問題是忌諱的,但我要問反正... :)如何處理重載方法簽名中的衝突?

我有一個方法:

private MembershipUser GetUserFromReader(SqlDataReader reader) 

而且我要重載這個方法用不同返回類型:

private User GetUserFromReader(SqlDataReader reader) 

但編譯器抱怨說這兩個方法有相同的簽名。

那麼,這樣做的最好方法是什麼?我寧願不添加不必要的 參數來更改方法簽名。

我已經打了做類似的想法:

private User GetUserFromReader(T reader) 

但尚未真正在這個全呢。看起來我需要對我如何使用我的閱讀器對象進行一系列更改 。

任何想法?當你有兩個相同簽名的超載 方法時,最佳做法是什麼?

感謝您的幫助...

+0

是否有任何理由不能重命名私有方法?這不像它影響你班級的外部用戶 - 畢竟這是私人的。 – 2010-02-10 22:55:35

+0

是的,同意了。那得到了我的答案:) – 2010-02-11 19:52:41

回答

6

爲什麼超載呢?爲什麼不讓方法說,它做什麼,就像這樣:

private MembershipUser GetMembershipUserFromReader(SqlDataReader reader) 
private User GetUserFromReader(SqlDataReader reader) 
+0

謝謝。當我問這個問題時,我並沒有真正考慮可訪問性。我認爲這是最好的解決方案,因爲它是'私人'的。 – 2010-02-10 23:09:04

1

您無法更改過載的返回類型。編譯器應該如何告訴你想使用哪一個?

你應該做的是返回一個你可能想返回的東西的公共超類,然後返回任何適用的東西。

要麼是這樣,要麼以不同的方式命名方法,因爲它們明確地做了不同的事情。

2

你的唯一真正的選擇是:

  1. 改變功能
  2. 變化

我討厭被陳腐的函數簽名的名字,但有僅僅通過返回類型來限制區分方法的限制。

如果其中一個重載是在父類中聲明的,那麼您可以使用new關鍵字來從調用者中「隱藏」更高的方法,但new(在成員聲明上)通常被認爲是邪惡的。

1

簡單的答案是,就C#而言,你不能。通過返回類型重載是允許的(I 認爲)由MSIL,但不是由C#。

(即,不包括增加一個「虛擬」參數)的唯一真正的選擇,是調用一個方法GetMembershipUserFromReader和其他GetUserFromReader

+0

正確; CLR允許重載完全不同於返回類型。用於簽名匹配和CLR規則的C#規則之間存在許多細微差異;這是最明顯的一個。 – 2010-02-11 00:37:10

+0

@Eric:你知道爲什麼這是在CLR中實現嗎?我認爲這在C#的某些情況下可能會有用,但是我的同事不同意我的觀點。但是對於我來說,重載類型不明確的返回類型是有道理的。你覺得埃裏克怎麼樣? – 2010-02-11 01:46:32

+1

@Joan:在MSIL語言中沒有「重載分辨率」這樣的東西。每個方法(或虛擬方法槽)都有一個唯一的「標記」,方法調用幾乎就是「調用與此標記關聯的方法」。由於不需要基於參數進行重載解析,所以返回類型可以是簽名的一部分。 – 2010-02-11 07:44:12

5

如果你真的要區分返回類型,但使用相同的方法簽名,你可以使用泛型:

private T GetUserFromReader<T>(SqlDataReader reader) 

但是重新命名這些方法要簡單得多,就像在Luhmann的回答中一樣。

+0

謝謝你的包。當我用公共方法遇到同樣的情況時,我會放棄這一點。在這種情況下,因爲它是私人的,我同意盧曼的答案是最好的解決方案。 – 2010-02-10 23:08:32