C# language specification описывает вывод типа в разделе §7.5.2. В нем есть детали, которые я не понимаю. Рассмотрим следующий случай:Понимание проблемы. Вывод типа C#, как описано в спецификации языка.
// 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 является параметром значения, то нижний вывод выполнен из U-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 Си всех типов Uj, к которым не существует неявное преобразование из U удаляются из набора кандидатов. [...]
⇒ не удаляет что-либо из набора кандидатов, не так ли?
Если среди оставшихся типов кандидатов Uj существует уникальный тип V, из которого происходит неявное преобразование ко всем другим типам кандидатов, то Xi фиксируется на V.
⇒ Поскольку существует только один тип кандидата, это пусто, правда, поэтому Xi зафиксирован на
string
. Правильно?
Итак, где я буду неправильно?
Хм ... Хм. Возможно, вы обнаружили ошибку. Либо в спецификации, либо в реализации. Я посмотрю на это, когда я буду у меня на столе в понедельник; прямо сейчас я должен готовить обед. –
@ Эрик - ОК ... мы разрешим вам поужинать, но нам нужен быстрый ответ в понедельник утром. :) – ChaosPandion
У меня болит голова ... – Rusty