3 回答

TA貢獻(xiàn)2039條經(jīng)驗 獲得超8個贊
一旦有更多派生類型簽名的重載,編譯器將始終選擇您提供的最具體類型。
話雖如此,除非有人這樣做,否則new CustomRangeValidationAttrubute((object)"test")
如果您將字符串傳遞給CustomRangeValidationAttrubute
始終帶有string
in 參數(shù)的構(gòu)造函數(shù),則將被選擇。
關(guān)于這是否是不好的做法,如果我沒有看到您的特定用例,我無法確定,請記住您傳遞給的每個值類型都new CustomRangeValidationAttrubute(object)
將被裝箱,這很糟糕,因為它給 GC 和更何況你會失去類型安全。

TA貢獻(xiàn)1842條經(jīng)驗 獲得超13個贊
您有兩個重載,它們僅在引用類型上有所不同,并且引用類型之間存在層次關(guān)系,因此一個可以轉(zhuǎn)換為另一個。
在這種情況下,您真的應(yīng)該確保在選擇更廣泛的重載時代碼在邏輯上的行為相同,但引用結(jié)果是更派生的類型1,2。那是你集中注意力的地方。當(dāng)然,如果您能堅持這條規(guī)則,通常會發(fā)現(xiàn)派生程度更高的重載不是必需的,而只是在更廣泛的方法中進(jìn)行特殊處理。
1特別是因為,正如 vc74 在評論中指出的,重載決議(通常,忽略dynamic
)是在編譯時基于編譯時類型3 完成的。
2這符合重載的相同廣泛原則。不要重載,選擇哪一個會導(dǎo)致邏輯上不同的結(jié)果。如果你表現(xiàn)出不同的行為,不要給它們同一個名字(對于構(gòu)造函數(shù),這可能意味著分成兩個單獨(dú)的類,可能有一個共享的基類,如果這是你打算做的)
3我很欣賞這是一個屬性,所以你期望只有編譯時間是相關(guān)的,但我仍然會在可能的情況下在這里聽取一般原則。

TA貢獻(xiàn)1776條經(jīng)驗 獲得超12個贊
我解決此代碼的方法是將重載移動到具有單獨(dú)方法而不是原始構(gòu)造函數(shù)的新抽象類:
public CustomRangeValidationStringAttribute(string value) {}
public CustomRangeValidationGenericAttribute(object value) {}
在從這個新基類繼承的兩個類中,每個類都使用自己的方法,創(chuàng)建兩個不同的屬性以供選擇,[CustomRangeValidationString] 和 [CustomRangeValidationGeneric]。
- 3 回答
- 0 關(guān)注
- 232 瀏覽
添加回答
舉報