[英]multiple generic overloads
我有一个简单的帮助器类,用于构建一个简单的逗号分隔的字符串。
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());
}
我想为通用列表添加重载
public void Add<T>(IEnumerable<T> values)where T:struct
{
foreach (T t in values)
{
Add(t.ToString());
}
}
但是任何调用此方法的尝试都称为第一个通用方法。 因此,我最终将第二个通用方法重命名为AddAll。 最后,我认为这是解决此问题的正确方法,但我想知道是否有可能将两者结合起来以备将来参考。
--edit这是行不通的情况
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
--edit 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;
}
和对此的呼吁
test2.Add<IEnumerable<long>,long>(aList);
尝试删除where T : struct
约束,我认为您将获得正确的行为。
IEnumerable<char> <==> String
,因为string
只是char[]
。 由于string
不是真正的值对象,因此重载分辨率几乎总是倾向于第一种方法,以避免将字符串转换为IEnumerable<char>
的装箱/拆箱操作。 (我猜您已经尝试使用"foo"
和IEnumerable<bar>
调用它,其中bar
是一个结构)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.