Рассмотрим следующий класс,
class Foo
{
public Foo(int count)
{
/* .. */
}
public Foo(int count)
{
/* .. */
}
}
Выше код недействителен и не будет компилироваться. Теперь рассмотрим следующий код,
class Foo<T>
{
public Foo(int count)
{
/* .. */
}
public Foo(T t)
{
/* .. */
}
}
static void Main(string[] args)
{
Foo<int> foo = new Foo<int>(1);
}
Выше код действителен и хорошо компилируется. Он вызывает Foo (int count).
Мой вопрос: если первый недопустимый, как второй может быть действительным? Я знаю класс Foo <T> действительно, потому что T и int - разные типы. Но когда он используется как Foo <int> foo = new Foo <int> (1), T получает целочисленный тип, и оба конструктора будут иметь одну и ту же подпись справа? Почему компилятор не показывает ошибку, а не выбирает перегрузку для выполнения?