Почему ограничения типа не являются частью сигнатуры метода?

ОБНОВЛЕНИЕ: Начиная с C # 7.3, это больше не должно быть проблемой. Из примечаний к выпуску:

Когда группа методов содержит некоторые универсальные методы, аргументы типа которых не удовлетворяют их ограничениям, эти члены удаляются из набора кандидатов.

Pre C # 7.3:

Итак, я прочитал Эрика Липперта «Ограничения не являются частью сигнатуры» , и теперь я понимаю, что в спецификации указано, что ограничения типа проверяются ПОСЛЕ разрешения перегрузки, но я Я до сих пор не понимаю, почему это ДОЛЖНО быть так. Ниже приведен пример Эрика:

static void Foo(T t) where T : Reptile { }
static void Foo(Animal animal) { }
static void Main() 
{ 
    Foo(new Giraffe()); 
}

Это не компилируется, потому что разрешение перегрузки для: Foo (new Giraffe ()) предполагает, что Foo является лучшим совпадением перегрузки, но затем ограничения типа не работают, и возникает ошибка времени компиляции. По словам Эрика:

Принцип здесь состоит в том, чтобы разрешение перегрузки (и вывод типа метода) находило наилучшее возможное совпадение между списком аргументов и списком формальных параметров каждого метода-кандидата. То есть смотрят на подпись метода кандидата.

Типовые ограничения НЕ являются частью сигнатуры, но почему они не могут быть? Каковы сценарии, когда рассматривать ограничения типа как часть сигнатуры - плохая идея? Это просто сложно или невозможно реализовать? Я не выступаю за то, чтобы, если по какой-либо причине невозможно вызвать наилучшую выбранную перегрузку, то молча откатывайтесь к второй лучшей перегрузке; Я бы это возненавидел. Я просто пытаюсь понять, почему нельзя использовать ограничения типа, чтобы повлиять на выбор лучшей перегрузки.

Я представляю себе, что внутри компилятора C #, только для целей разрешения перегрузки (он не переписывает метод навсегда) , следующее:

static void Foo(T t) where T : Reptile { }

преобразуется в:

static void Foo(Reptile  t) { }

Почему не можете ли вы как бы «втянуть» ограничения типа в список формальных параметров? Как это плохо меняет подпись? Мне кажется, это только усиливает подпись. Тогда Foo никогда не будет рассматриваться как кандидат на перегрузку.

Edit 2: Неудивительно, что мой вопрос был таким запутанным. Я неправильно прочитал блог Эрика и привел неправильный пример. Я отредактировал пример, который считаю более подходящим. Я также изменил название, чтобы быть более конкретным. Этот вопрос не кажется таким простым, как я сначала представлял, возможно, я упускаю какую-то важную концепцию. Я менее уверен, что это материал stackoverflow, возможно, лучше перенести этот вопрос / обсуждение в другое место.

9
задан Daryl 21 May 2019 в 05:55
поделиться