Вызов перегрузки конструктора, когда обе перегрузки имеют одинаковую подпись
Рассмотрим следующий класс,
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 (целое число).
Мой вопрос: если первый недействителен, как второй может быть действительным? Я знаю классFoo <T> допустимо, потому что T и int являются разными типами. Но когда он используется какFoo <int> foo = new Foo <int> (1), T получает целочисленный тип, и оба конструктора будут иметь одинаковую подпись, верно? Почему компилятор не показывает ошибку, а не выбирает перегрузку для выполнения?