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>);