[英]C# method selection chooses object instead of IEnumerable<object> when passing a primitive type collection
我有一个带有两个添加方法的对象:
public void Add(string keyName, object value)
public void Add(string keyName, IEnumerable<object> values)
如果调用它并提供一个对象,它将调用第一个对象。 如果提供IEnumerable,则调用第二个。 但是,如果提供原始类型的IEnumerable,它将调用第一个。
有没有办法让c#选择第二种方法并将其装箱,而不是将数组视为对象?
如果不是,我想我将在第一个add方法中进行检查,以查看它是否为原始类型ienumerable并强制其调用第二个方法。
您可以为此使用泛型。 如果将第二种方法更改为:
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>();
要添加到@Chris答案并解释为什么它不适合您的方式。 IEnumerable<T>
定义如下:
public interface IEnumerable<out T>
out
表示类型T
是协变的,这意味着您可以在其位置使用子类型。 在你的情况下,它意味着你可以使用任何类型的继承自object
,其中IEnumerable<object>
预计,如IEnumerable<string>
。 但是那些协方差修饰符(输出\\输入)不适用于值类型(结构)。 这意味着IEnumerable<string>
可转换为IEnumerable<object>
但IEnumerable<int>
不能。 因此,编译器无法选择第二重载,因为它将无法编译。
解决此问题的正确方法是使用泛型(您也可以使用en.Cast<object>()
显式转换IEnumerable<int>
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.