C#,单个T和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
    }

无论我发送给此方法什么,总是选择第一个。如何将IEnmuerable和单个对象分开?

AddOrUpdate(entry); //goes into first one
AddOrUpdate(new Analog[] { entry}); //still goes into first one

解决方法

鉴于您根本不想更改方法声明,我可以通过两种方法使编译器在调用该方法时更喜欢第二种方法。

  • 指定通用参数:

    $ rrdtool dump /var/db/rrd/homed_sensor_7.rrd | grep '2020-08-11 08:1'
    <!-- 2020-08-11 08:10:00 MSK / 1597122600 --> <row><v>2.600518229e+01</v></row>
    <!-- 2020-08-11 08:10:10 MSK / 1597122610 --> <row><v>2.480645131e+01</v></row>
    <!-- 2020-08-11 08:10:20 MSK / 1597122620 --> <row><v>2.350490220e+01</v></row>
    <!-- 2020-08-11 08:10:30 MSK / 1597122630 --> <row><v>2.546319293e+01</v></row>
    <!-- 2020-08-11 08:10:40 MSK / 1597122640 --> <row><v>2.546319293e+01</v></row>
    <!-- 2020-08-11 08:10:50 MSK / 1597122650 --> <row><v>2.480096602e+01</v></row>
    <!-- 2020-08-11 08:11:00 MSK / 1597122660 --> <row><v>2.480094575e+01</v></row>
    <!-- 2020-08-11 08:11:10 MSK / 1597122670 --> <row><v>2.391521916e+01</v></row>
    <!-- 2020-08-11 08:11:20 MSK / 1597122680 --> <row><v>2.570375508e+01</v></row>
    <!-- 2020-08-11 08:11:30 MSK / 1597122690 --> <row><v>2.305996423e+01</v></row>
    <!-- 2020-08-11 08:11:40 MSK / 1597122700 --> <row><v>2.655912879e+01</v></row>
    <!-- 2020-08-11 08:11:50 MSK / 1597122710 --> <row><v>2.480876661e+01</v></row>
    <!-- 2020-08-11 08:12:00 MSK / 1597122720 --> <row><v>2.481034981e+01</v></row>
    <!-- 2020-08-11 08:12:10 MSK / 1597122730 --> <row><v>2.480667576e+01</v></row>
    <!-- 2020-08-11 08:12:20 MSK / 1597122740 --> <row><v>2.480821922e+01</v></row>
    <!-- 2020-08-11 08:12:30 MSK / 1597122750 --> <row><v>2.481094399e+01</v></row>
    <!-- 2020-08-11 08:12:40 MSK / 1597122760 --> <row><v>2.266941020e+01</v></row>
    <!-- 2020-08-11 08:12:50 MSK / 1597122770 --> <row><v>2.552484289e+01</v></row>
    <!-- 2020-08-11 08:13:00 MSK / 1597122780 --> <row><v>2.552484289e+01</v></row>
    <!-- 2020-08-11 08:13:10 MSK / 1597122790 --> <row><v>2.552484289e+01</v></row>
    <!-- 2020-08-11 08:13:20 MSK / 1597122800 --> <row><v>2.366359064e+01</v></row>
    <!-- 2020-08-11 08:13:30 MSK / 1597122810 --> <row><v>2.595585752e+01</v></row>
    <!-- 2020-08-11 08:13:40 MSK / 1597122820 --> <row><v>2.383080995e+01</v></row>
    <!-- 2020-08-11 08:13:50 MSK / 1597122830 --> <row><v>2.578249258e+01</v></row>
    <!-- 2020-08-11 08:14:00 MSK / 1597122840 --> <row><v>2.476898851e+01</v></row>
    <!-- 2020-08-11 08:14:10 MSK / 1597122850 --> <row><v>2.485007357e+01</v></row>
    <!-- 2020-08-11 08:14:20 MSK / 1597122860 --> <row><v>2.249212094e+01</v></row>
    <!-- 2020-08-11 08:14:30 MSK / 1597122870 --> <row><v>2.712694797e+01</v></row>
    <!-- 2020-08-11 08:14:40 MSK / 1597122880 --> <row><v>2.480676238e+01</v></row>
    <!-- 2020-08-11 08:14:50 MSK / 1597122890 --> <row><v>2.397873126e+01</v></row>
    <!-- 2020-08-11 08:15:00 MSK / 1597122900 --> <row><v>2.563894731e+01</v></row>
    <!-- 2020-08-11 08:15:10 MSK / 1597122910 --> <row><v>2.480573101e+01</v></row>
    <!-- 2020-08-11 08:15:20 MSK / 1597122920 --> <row><v>2.333396444e+01</v></row>
    <!-- 2020-08-11 08:15:30 MSK / 1597122930 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:15:40 MSK / 1597122940 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:15:50 MSK / 1597122950 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:16:00 MSK / 1597122960 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:16:10 MSK / 1597122970 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:16:20 MSK / 1597122980 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:16:30 MSK / 1597122990 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:16:40 MSK / 1597123000 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:16:50 MSK / 1597123010 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:17:00 MSK / 1597123020 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:17:10 MSK / 1597123030 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:17:20 MSK / 1597123040 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:17:30 MSK / 1597123050 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:17:40 MSK / 1597123060 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:17:50 MSK / 1597123070 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:18:00 MSK / 1597123080 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:18:10 MSK / 1597123090 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:18:20 MSK / 1597123100 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:18:30 MSK / 1597123110 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:18:40 MSK / 1597123120 --> <row><v>2.488628828e+01</v></row>
    <!-- 2020-08-11 08:18:50 MSK / 1597123130 --> <row><v>2.432612710e+01</v></row>
    <!-- 2020-08-11 08:19:00 MSK / 1597123140 --> <row><v>2.529321738e+01</v></row>
    <!-- 2020-08-11 08:19:10 MSK / 1597123150 --> <row><v>2.268383952e+01</v></row>
    <!-- 2020-08-11 08:19:20 MSK / 1597123160 --> <row><v>2.587393409e+01</v></row>
    <!-- 2020-08-11 08:19:30 MSK / 1597123170 --> <row><v>2.587393409e+01</v></row>
    <!-- 2020-08-11 08:19:40 MSK / 1597123180 --> <row><v>2.316523793e+01</v></row>
    <!-- 2020-08-11 08:19:50 MSK / 1597123190 --> <row><v>2.645360868e+01</v></row>
    <!-- 2020-08-11 08:10:00 MSK / 1597122600 --> <row><v>2.479729023e+01</v></row>
    
  • 使编译时间类型为AddOrUpdate<Analog>(new Analog[] { entry }); 的参数:

    IEnumerable<Analog>
,

因为第一个重载的定义表明,在每次调用方法而未显式指向泛型参数({时,方法的参数与其泛型参数具有相同的类型(均为T类型) {1}}),编译器决定类型匹配-AddOrUpdate(new Analog[] { entry })。 您需要显式指向泛型参数,以帮助编译器选择正确的重载:

AddOrUpdate<Analog[]>(new Analog[] { entry })
,

您还可以显式传递参数的类型:

AddOrUpdate(someEnumerable as IEnumerable<Analog>);