Проблема понимает вывод типа C #, как описано в языковой спецификации

StackOverflow https://stackoverflow.com/questions/3697252

Вопрос

То Спецификация языка C # Описывает вывод типа в разрезе § 7.5.2. В нем есть деталь, что я не понимаю. Рассмотрим следующий случай:

// declaration
void Method<T>(T obj, Func<string, T> func);

// call
Method("obj", s => (object) s);

Компиляторы Microsoft и Mono C # правильно выводятся T = object, но мое понимание алгоритма в спецификации получится T = string а потом потерпеть неудачу. Вот как я понимаю это:

Первая фаза

  • Если EI является анонимной функцией, Явный вывод типа параметра (§ 7.5.2.7) сделан из Ei для Ti

    ⇒ не имеет никакого эффекта, потому что выражение лямбда не имеет явных типов параметров. Верно?

  • В противном случае, если EI имеет тип u и xi - это параметр значения, то нижний вывод сделан от тебя до Ti.

    ⇒ Первый параметр имеет статический тип string, так что это добавляет string на нижние границы для T, Правильно?

Вторая фаза

  • Все неверно Тип переменных Xi, которые не зависит от (§ 7.5.2.5) Любой XJ фиксирован (§ 7.5.2.10).

    T нефиксируется; T не зависит от чего-либо ... так T должно быть исправлено, верно?

§ 7.5.2.11 Фиксация

  • Набор типов кандидатов UJ начинается как набор всех типов в наборе границ для XI.

    ⇒ { string (нижняя граница) }

  • Затем мы изучаем каждую границу для XI в свою очередь: [...] Для каждой нижней границы U Xi всех типов UJ, к которым нет неявного преобразования от U, удаляются из набора кандидата. [...

    ⇒ Не удаляет ничего от набора кандидата, верно?

  • Если среди оставшихся типов кандидатов UJ есть уникальный тип V, из которого есть неявное преобразование ко всем другим типам кандидата, то Xi фиксируется V.

    ⇒ Поскольку есть только один тип кандидата, это беспринципно, так что Xi прикреплен к string. Отказ Верно?


Так куда я иду не так?

Это было полезно?

Решение

Обновление: Мое начальное расследование в автобусе сегодня утром было неполным и неправильным. Текст первой спецификации фазы является правильным. Реализация правильная.

Спецификация неправильно в том, что он получает порядок событий неправильно на втором этапе. Мы должны указывать, что мы производим выводы вывода до Мы исправим не зависимые параметры.

Человек, этот материал сложно. Я переписал этот раздел спецификации больше раз, чем я могу вспомнить.

Я видел эту проблему раньше, и я отчетливо вспомним внесение изменений, так что неверный термин «переменная типа» был заменен повсюду с «типом параметра». (Параметры типа не являются местоположениями хранения, содержимое которых может варьироваться, поэтому не имеет смысла называть их переменными.) Я думаю, что в то же время я отметил, что упорядочение было неверным. Вероятно, что произошло, мы случайно отправили более старую версию спецификации в Интернете. Многие извинения.

Я буду работать с MADS, чтобы получить спецификацию, чтобы соответствовать реализации. Я думаю, что правильная формулировка второго этапа должна идти что-то подобное:

  • Если никаких недельных параметров типа не существует, то тип вывода добивается успеха.
  • В противном случае, если существует один или несколько аргументов Ei с соответствующим типом параметра Ti так, что выходной тип Ei с типом Ti содержит, по меньшей мере, один нефиксированный параметр типа xj, и ни один из входных типов EI с типом Ti содержит любой неверный тип параметра Xj, то вывод вывода вывод сделан из всех таких Ei к Ti.

Будь то предыдущий шаг фактически сделал вывод, теперь мы должны исправить по крайней мере один параметр типа, следующим образом:

  • Если существует один или несколько параметров типа xi такой, что Xi не уверена, и Xi имеет непустой набор границ, и Xi не зависит от любого XJ, то каждый такой Xi фиксируется. Если какая-либо операция по исправлению выходит из строя, то тип вывода не удается.
  • В противном случае, если существует один или несколько параметров типа xi такой, что Xi неаклизуется, и Xi имеет непустой набор границ, и есть по меньшей мере один тип параметра Xj, который зависит от XI, то каждый такой Xi фиксируется. Если какая-либо операция по исправлению выходит из строя, то тип вывода не удается.
  • В противном случае мы не можем добиться прогресса, и есть нефиксированные параметры. Тип вывод не удается.

Если вывод типа ни проходит не и не удается, то вторая фаза повторяется.

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

Спасибо за то, что привлечь это к моему вниманию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top