2017-05-25 50 views
1

當我有一個對象有兩個添加方法:C#方法選擇選擇對象,而不是IEnumerable的<object>傳遞一個基本類型集合

public void Add(string keyName, object value)

public void Add(string keyName, IEnumerable<object> values)

如果你調用它,並且提供一個對象,它稱之爲第一個。如果你提供一個IEnumerable,它會調用第二個。但是,如果您提供了一個基本類型的IEnumerable,它會調用第一個。

有沒有辦法讓c#選擇第二種方法,並將其放入框中,而不是將數組視爲對象?

如果不是,我想我會在第一個add方法中檢查它是否是一個原始類型ienumerable並強制它調用第二個方法。

+0

你忘記了任何東西都可以被轉換成'object',這就是發生在這裏的事 – Rahul

+0

所以這看起來像是一個非常簡單的問題,在這個問題中添加一個獨立的例子。事實上,這個問題由於缺席而引人注目。 – spender

+0

「如果不是,我想我會在第一個添加方法中檢查它是否是一個可枚舉的原始類型,並強制它調用第二個方法。」 - 你希望如何做到這一點? 'IEnumerable '不可轉換爲'IEnumerable '。 – hvd

回答

7

您可以使用這種泛型。如果你改變了第二種方法:

public void Add<T>(string keyName, IEnumerable<T> values) 
{ 

} 

然後,如果它是任何種類的IEnumerable<T>(如IEnumerable<int>),那麼它將使用泛型方法。

值得注意的是IEnumerable<T>是不完全一樣的IEnumerable<object>所以如果你需要是一個IEnumerable<object>你會需要像IEnumerable<object> obList = values.Cast<object>();

+0

啊我明白了,這確實更有意義。謝謝。 – NibblyPig

+0

除非我瘋了,即使我只是傳遞一個普通的字符串,它也會調用該方法。這怎麼可能呢。它在第一行遇到一個斷點,如果我做了values.GetType(),它是一種「String」...它應該擊中另一個方法,當然一個字符串不是'IEnumerable '!? – NibblyPig

+0

哦poo,字符串是IEnumerable 是不是... – NibblyPig

3

要添加到@克里斯的回答,並解釋爲什麼它不以你的方式工作。 IEnumerable<T>定義是這樣的:

public interface IEnumerable<out T> 

out意味着鍵入T是協變的,這反過來又意味着你可以使用子類型在它的位置。在你的情況下,這意味着你可以使用從object繼承的任何類型,其中IEnumerable<object>是預期的,例如IEnumerable<string>。但這些協變修飾符(out \ in)不適用於值類型(結構)。這意味着IEnumerable<string>可以轉換爲IEnumerable<object>,但IEnumerable<int>不可以。所以編譯器不能選擇第二個重載,因爲它不會編譯。

解決,作爲已經回答正確的方法是使用泛型(你也可以明確地投IEnumerable<int>en.Cast<object>())。

+0

上多餘的背景下良好的工作。我也已經先加鑄入我的答案,以及(在你想必閱讀我的答案時,你正在寫你的) – Chris

+0

非常感謝您的額外信息,這是很好理解爲什麼發生這種情況。 – NibblyPig