using System.Collections.Generic;
class A
{
private a : /*1*/ List.[string] = /*2*/ List.[string]();
F() : void
{
def x = /*3*/ List.[string]();
}
}
Компилятор разрешает в первом указании типа не писать ".", однако во втором и в третьем случае обязывает.
Можно ли улучшить эту ситуацию?
Например, введя дополнительные эвристики:
В выражении A[B](...), ежели A и B типы, и A обобщенный тип, то это выражение трактуется как A.[B](...).
Иначе, если забыть поставить точку получим фейерверк:
a.n:2:39:2:51: ←[01;31merror←[0m: cannot find any suitable indexer in 'List' (type is ? -> ?)
a.n:2:39:2:51: ←[01;31merror←[0m: cannot find any suitable indexer in 'List' (type is ? -> ?)
a.n:2:39:2:51: ←[01;31merror←[0m: cannot find any suitable indexer in 'List' (type is ? -> ?)
a.n:2:39:2:43: ←[01;31merror←[0m: typing fails on ambiguity between overloads:a.n:2:39:2:43: ←[01;32mhint←[0m: Posible overload: constructor System.Collections.Generic.List..ctor(collection : System.Collections.Generic.IEnumerable[T]) : System.Collections.Generic.List.[T]
a.n:2:39:2:43: ←[01;32mhint←[0m: Posible overload: constructor System.Collections.Generic.List..ctor(capacity : int) : System.Collections.Generic.List.[T]
a.n:2:39:2:43: ←[01;32mhint←[0m: Posible overload: constructor System.Collections.Generic.List..ctor() : System.Collections.Generic.List.[T]a.n:2:39:2:51: ←[01;31merror←[0m: cannot find any suitable indexer in 'List' (type is ? -> ?)
a.n:2:39:2:51: ←[01;31merror←[0m: typing fails on delayed typing of indexerconfused by earlier errors bailing out
Здравствуйте, _nn_, Вы писали:
__>Компилятор разрешает в первом указании типа не писать ".", однако во втором и в третьем случае обязывает.
Можно. Заставить писать точку всегда.
__>Можно ли улучшить эту ситуацию?
__>Например, введя дополнительные эвристики:
__>__>В выражении A[B](...), ежели A и B типы, и A обобщенный тип, то это выражение трактуется как A.[B](...).
__>
Какая это эвристика? Это попытка разрешения неоднозначности за счет типизации.
ЗЫ
Главное что все это фиг не нужно никому. Просто не нужно явно указывать параметры типов и все. Компилятор и так все отлично выводит.
Тратить время на эту фигню просто не целесообразно.
Здравствуйте, _nn_, Вы писали:
__>Иначе, если забыть поставить точку получим фейерверк:...
А ты попробуй забыть поставить не только точку, но и все остальное.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _nn_, Вы писали:
__>>Компилятор разрешает в первом указании типа не писать ".", однако во втором и в третьем случае обязывает.
VD>Можно. Заставить писать точку всегда.
Тогда будет тем более странным почему нельзя синтаксис сделать в виде Тип.<Тип>
Не писать тип это решение, тогда это нужно добавить в статью отличия C# от Nemerle.