Свойства возвращающие void.
В C# такой трюк не пройдет.
Может быть это баг ?
using System.Console;
class A
{
public P : void { get { } }
}
when (A().P is ()) WriteLine("void");
Почти обобщенный индексер.
Это компилируется
, однако 'T' нигде нельзя использовать.
class A
{
public Item[T][x : int] : int { get { 0 } }
}
_NN>Свойства возвращающие void.
_NN>В C# такой трюк не пройдет.
_NN>Может быть это баг ?
На сколько я понимаю, это скорее баг в дизайне C#. Getter'ы — это синтаксический сахар над функциями вида
void -> T
. В C# невозможно конкретизировать T типом void, поскольку не существует
значений, имеющих данный тип. Но для функциональных языков программирования принцип "всё является значением" крайне важнен. Поэтому в Nemerle существует void-литерал, а в F# — тип unit. Это позволяет не делать void особым случаем и иметь один вид функциональных типов. В C# же пришлось городить Func<T> для типов имеющих значения и Action<T> для void'а.
_NN>Почти обобщенный индексер.
_NN>Это компилируется , однако 'T' нигде нельзя использовать.
Это баг. Синтаксически все корректно, но типовая переменная не создается. Надо либо сделать такое выражение синтаксически некорректным, либо все же создавать типовую переменную и разрешить параметризацию индексаторов типами
def i = A().Item.[string][0];
Здравствуйте, STDray, Вы писали:
STD>На сколько я понимаю, это скорее баг в дизайне C#.
Не сказал бы, что невозможность void-пропертей является багом.
STD> В C# невозможно конкретизировать T типом void, поскольку не существует значений, имеющих данный тип.
К сожалению, причина даже не в этом, а в том, что конкретизация типом void невозможна в CLR.
STD> Поэтому в Nemerle существует void-литерал, а в F# — тип unit.
Жаль в Nemerle не существует типа unit, это многое упростило бы.
STD> Это позволяет не делать void особым случаем и иметь один вид функциональных типов. В C# же пришлось городить Func<T> для типов имеющих значения и Action<T> для void'а.
В Nemerle
та же фигня
Такие мелочи, я бы сказал, не баги и не фичи, а следствие того, что система типов Nemerle побогаче системы типов .NET, и непонятно как между ними провести соответствие. С одной стороны, нахрен кому-нибудь void-свойства. С другой стороны, зачем искуственно ограничивать язык.