繁体   English   中英

C#方法选择选择对象而不是IEnumerable <object> 传递原始类型集合时

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM