Редактировать: я не уверен, что вы можете завершить это, как вы пытаетесь. Я попробовал всевозможные уловки, чтобы попытаться заставить это работать, и не могу заставить это скомпилировать. Лучшее, что я могу сделать, - вытащить вызов метода за пределы моего общего класса. Если ваш вызов метода находится за пределами, то вы можете конкретно определить, что T в общем. Однако внутри метода во время компиляции компилятор не знает, каким будет T, поэтому он не знает, какой перегруженный метод вызвать. Единственный способ обойти это - использовать переключатель, чтобы определить тип T и вручную указать перегрузку для вызова.
Лучшее, что я могу сделать - это не совсем то, что вам нужно, но его можно использовать для аналогичного эффекта:
class Stuff<T>
{
public T value { get; set; }
}
class Program
{
static void DummyFunc(Stuff<int> inst)
{
Console.WriteLine("Stuff<int>: {0}", inst.value.ToString());
}
static void DummyFunc(Stuff<string> inst)
{
Console.WriteLine("Stuff<string>: {0}", inst.value);
}
static void DummyFunc(int value)
{
Console.WriteLine("int: {0}", value.ToString());
}
static void DummyFunc(string value)
{
Console.WriteLine("string: {0}", value);
}
static void Main(string[] args)
{
var a = new Stuff<string>();
a.value = "HelloWorld";
var b = new Stuff<int>();
b.value = 1;
var c = "HelloWorld";
var d = 1;
DummyFunc(a);
DummyFunc(b);
DummyFunc(c);
DummyFunc(d);
}
}
и получил вывод:
Stuff<string>: HelloWorld
Stuff<int>: 1
string: HelloWorld
int: 1
У меня есть четыре перегруженные функции, ссылающиеся на два ссылающихся универсальных класса (один для int и один для строки) и два ссылающихся на обычные типы (один для int и один для строки), и все это работает хорошо ... после?
Edit: проблема, кажется, не в вызове перегруженных методов, это связано с вашим foreach, который пытается преобразовать все элементы в списке в тот же тип, что и первый, чтобы ссылаться на перегруженный метод. Первый элемент, который не соответствует этому точному определению, приведет к сбою компиляции.