多个泛型重载

本文关键字:重载 泛型 | 更新日期: 2023-09-27 18:05:15

我有一个简单的助手类,我用它来构建一个简单的逗号分隔字符串。

private string AddcsvString(string s)
{
    if(string.IsNullOrWhiteSpace(this.Value))
    {
        return s;
    }
    else
    {
        return this.Value + "," + s;
    }
}

我还有一个泛型方法来调用这个

public void Add<T>(T s) where T: struct 
{
     this.Value = AddcsvString(s.ToString());
}

我想为泛型List添加一个重载

public void Add<T>(IEnumerable<T> values)where T:struct 
{
    foreach (T t in values)
    {
        Add(t.ToString());
    }
}

但是任何调用this的尝试都会调用第一个泛型方法。所以我最终将第二个泛型方法重命名为AddAll。最后,我认为这是正确的方式去这种情况下,但我想知道是否有可能有两个供今后参考。

——编辑下面是不工作的情况

CsvString test = new CsvString();
string result;
test.Add(1);
test.Add('2');
test.Add("3");
result = test.ToString();  //  result = "1,2,3"
CsvString test2 = new CsvString();
List<long> aList = new List<long>();
string result2;
aList.Add(1);
aList.Add(2);
aList.Add(3);
test2.Add(aList);  //line doesn't compile

——编辑2我找到了第二个解决方案(尽管下面的JoshE得到了回答这个问题的荣誉,顺便说一句)。我把第二个方法改成了

public SWcsvString Add<T,K>(T values)where T: IEnumerable<K> where K: struct
{
    foreach (K k in values)
    {
        Add(k.ToString());
    }
    return this;
}

和对this

的调用
test2.Add<IEnumerable<long>,long>(aList);

多个泛型重载

尝试删除您的约束where T : struct,我认为您将获得适当的行为。

IEnumerable<char> <==> String,因为string就是char[]。由于string不是真正的值对象,因此重载解析几乎总是倾向于第一种方法,以避免将字符串转换为IEnumerable<char>的装箱/拆箱操作。(我猜你已经尝试过用"foo"IEnumerable<bar>调用它,其中bar是一个结构体)。