2017-05-25 52 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