Вывод типов в локальной функции и match по вариантам (баг?)
Не компилируется следующее:
public variant Variant
{
| Option1
| Option2
}
class Class1
{
public Method(variants: list[Variant]): void
{
def loop(variants)
{
| Option1 :: [] => ()
| _ => ()
}
loop(variants)
}
}
Выдает следующие ошибки:
Error 1 unbound type name Option1 C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n 21 8 NemerleWinApp
Error 2 in argument #1 (variants) of loop, needed a list.Cons[System.Object+], got list[NemerleWinApp.Variant]: Nemerle.Core.list is not a subtype of Nemerle.Core.list.Cons [simple require] C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n 25 5 NemerleWinApp
Исходя из 2 ошибки понятно что по match выводится что в параметре variants не может быть пустого списка, хотя это наверно не правильно, ведь в последний образец подходит и пустой список. Изменяем исходник следующим образом (см. выделенное):
public variant Variant
{
| Option1
| Option2
}
class Class1
{
public Method(variants: list[Variant]): void
{
def loop(variants)
{
| Option1 :: [] => ()
| [] => ()
| _ => ()
}
loop(variants)
}
}
Но и так тоже не компилируется. Ошибка:
Error 1 unbound type name Option1 C:\Users\Александр\Documents\Visual Studio 2005\Projects\Test\NemerleWinApp\NemerleWinApp\Class1.n 21 8 NemerleWinApp
Если же первый кусок изменить следующим образом (см. выделенное):
public variant Variant
{
| Option1
| Option2
}
class Class1
{
public Method(variants: list[Variant]): void
{
def loop(variants: list[Variant])
{
| Option1 :: [] => ()
| _ => ()
}
loop(variants)
}
}
То все нормально компилируется.
Если match не в локальной функции, то тоже компилируется.
Так же компилируется если в первом куске Option1 заменить на Variants.Option1 (см. выделенное):
public variant Variant
{
| Option1
| Option2
}
class Class1
{
public Method(variants: list[Variant]): void
{
def loop(variants)
{
| Variants.Option1 :: [] => ()
| _ => ()
}
loop(variants)
}
}
Это баг или я чего-то не понял?
ЗЫ. Моя версия что Option1 не считается variant option и из за этого в выводе типов что-то не срабатывает.
... << RSDN@Home 1.2.0 alpha rev. 761>>
Здравствуйте, Иванков Дмитрий, Вы писали:
ДА>>Вывод типов в локальной функции и match по вариантам (баг?)
ИД>[skipped]
ДА>>ЗЫ. Моя версия что Option1 не считается variant option и из за этого в выводе типов что-то не срабатывает.
ИД>Неполное имя variant-а не дает информации для вывода типа, ограничения вида "у типа есть метод/вложенный класс/вариант с таким-то именем /и сигнатурой" не используются в выводе типов.
ИД>Как именно происходит вывод в данном случае и как поправить — надо смотреть.
Почему тогда кусок №1 не компилируется с сообщением "unbound type name Option1", а кусок №2 компилируется, хотя тип локальной функции в куске №1 выводится правильно (вроде бы) и соответствует типу в куске №2.
Кусок №1:
public variant Variant
{
| Option1
| Option2
}
class Class1
{
public Method(variants: list[Variant]): void
{
def loop(variants)
{
| Option1 :: [] => ()
| [] => ()
| _ => ()
}
loop(variants)
}
}
Кусок №2:
public variant Variant
{
| Option1
| Option2
}
class Class1
{
public Method(variants: list[Variant]): void
{
def loop(variants: list[Variant])
{
| Option1 :: [] => ()
| _ => ()
}
loop(variants)
}
}
... << RSDN@Home 1.2.0 alpha rev. 761>>
Здравствуйте, Дьяченко Александр, Вы писали:
ДА>Почему тогда кусок №1 не компилируется с сообщением "unbound type name Option1", а кусок №2 компилируется, хотя тип локальной функции в куске №1 выводится правильно (вроде бы) и соответствует типу в куске №2.
О, в багтрекере уже есть соответствующая
запись #773, пока что статус фича, если кто починит — станет пофиксенным багом
Сейчас значит правило простое — если тип сразу задан или сделан using, то можно писать Option1, иначе — Variant.Option1.
Здравствуйте, Иванков Дмитрий, Вы писали:
ДА>>Почему тогда кусок №1 не компилируется с сообщением "unbound type name Option1", а кусок №2 компилируется, хотя тип локальной функции в куске №1 выводится правильно (вроде бы) и соответствует типу в куске №2.
ИД>О, в багтрекере уже есть соответствующая запись #773, пока что статус фича, если кто починит — станет пофиксенным багом
ИД>Сейчас значит правило простое — если тип сразу задан или сделан using, то можно писать Option1, иначе — Variant.Option1.
Если не ошибаюсь это уже обсуждалось. Это недоработка вывода типов, т.е. это не баг, просто неудобное поведение. Авторы вроде как знают, но не считают проблему серьезной. Можете их еще раз токнуть. Может они исправят это дело.
... << RSDN@Home 1.2.0 alpha rev. 637>>