Интерфейс контекстно-зависимой типизации
Opened this issue · 0 comments
В языке есть несколько элементов, которые не имеют собственного типа и требуют его указания во внешнем контексте:
- Литерал
null
- Лямбда-функция с опущенными типами аргументов
- Скоро добавится метка обобщенного типа, не имеющая связанного объекта ( как
None
вOption<T>
).
Сейчас контекст для них разрешается по-разному. Есть смысл унифицировать механизм до единого.
Например, эти ноды реализуют некий интерфейс IPartiallyTypedNode
:
interface IPartiallyTypedNode
{
bool IsPartiallyTyped { get; }
void SetInferredType(Type type);
}
Пока IsPartiallyTyped == true
, вызов Emit()
вызывает ошибку, завивимую от ноды. Вызов метода SetInferredType
гасит этот флаг. Проверка будет стоять, как и сейчас, в четырех местах:
- Передача аргумента в метод
- Присвоение значения в переменную, поле или индекс массива
- Приведение значения к типу
- Использование аргумента в операторе композиции функций
Кроме того, потребуется особая обработка в инициализаторах коллекций.
Такой подход позволит также разрешить проблему того, что Expand()
не может вернуть анонимную функцию с неуказанными типами. Вместо этого нода помечается данным интерфейсом, требует явного указания типа из контекста и возвращает уже типизированную лямбду.