C#,单个 T 和 IEnumerable<T> 的重载
C#, overload for single T and for IEnumerable<T>
public static void AddOrUpdate<T>(T entry) where T : class
{
//stuff
}
public static void AddOrUpdate<T>(IEnumerable<T> entries) where T : class
{
foreach (var entry in entries)
{
//stuff
}
无论我向这个方法发送什么,总是选择第一个。如何分离 IEnmuerables 和单个对象?
AddOrUpdate(entry); //goes into first one
AddOrUpdate(new Analog[] { entry}); //still goes into first one
鉴于您根本不想更改方法声明,我可以想到两种方法让编译器在您调用方法时更喜欢第二种方法。
指定泛型参数:
AddOrUpdate<Analog>(new Analog[] { entry });
生成编译时类型的参数IEnumerable<Analog>
:
IEnumerable<Analog> x = new Analog[] { entry };
AddOrUpdate(x);
// or
AddOrUpdate(new string[] {""}.AsEnumerable());
因为第一个重载的定义指出,每当您调用该方法而未显式指向泛型参数时,该方法的参数与其泛型参数的类型相同(均为 T
类型) (AddOrUpdate(new Analog[] { entry })
) 编译器决定类型匹配 - AddOrUpdate<Analog[]>(new Analog[] { entry })
。
您需要明确指出泛型参数以帮助编译器选择正确的重载:
AddOrUpdate<Analog>(new Analog[] { entry });
您也可以显式传入参数的类型:
AddOrUpdate(someEnumerable as IEnumerable<Analog>);
public static void AddOrUpdate<T>(T entry) where T : class
{
//stuff
}
public static void AddOrUpdate<T>(IEnumerable<T> entries) where T : class
{
foreach (var entry in entries)
{
//stuff
}
无论我向这个方法发送什么,总是选择第一个。如何分离 IEnmuerables 和单个对象?
AddOrUpdate(entry); //goes into first one
AddOrUpdate(new Analog[] { entry}); //still goes into first one
鉴于您根本不想更改方法声明,我可以想到两种方法让编译器在您调用方法时更喜欢第二种方法。
指定泛型参数:
AddOrUpdate<Analog>(new Analog[] { entry });
生成编译时类型的参数
IEnumerable<Analog>
:IEnumerable<Analog> x = new Analog[] { entry }; AddOrUpdate(x); // or AddOrUpdate(new string[] {""}.AsEnumerable());
因为第一个重载的定义指出,每当您调用该方法而未显式指向泛型参数时,该方法的参数与其泛型参数的类型相同(均为 T
类型) (AddOrUpdate(new Analog[] { entry })
) 编译器决定类型匹配 - AddOrUpdate<Analog[]>(new Analog[] { entry })
。
您需要明确指出泛型参数以帮助编译器选择正确的重载:
AddOrUpdate<Analog>(new Analog[] { entry });
您也可以显式传入参数的类型:
AddOrUpdate(someEnumerable as IEnumerable<Analog>);