Неочевидные фичи
От: _NN_ www.nemerleweb.com
Дата: 18.01.13 18:55
Оценка:
Свойства возвращающие 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 } }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Неочевидные фичи
От: STDray http://stdray.livejournal.com
Дата: 19.01.13 13:36
Оценка:
_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];
Re[2]: Неочевидные фичи
От: catbert  
Дата: 23.01.13 11:11
Оценка:
Здравствуйте, 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-свойства. С другой стороны, зачем искуственно ограничивать язык.
Re[3]: Неочевидные фичи
От: STDray http://stdray.livejournal.com
Дата: 25.01.13 11:24
Оценка:
C>Не сказал бы, что невозможность void-пропертей является багом.
C>К сожалению, причина даже не в этом, а в том, что конкретизация типом void невозможна в CLR.
C>Жаль в Nemerle не существует типа unit, это многое упростило бы.
C>С одной стороны, нахрен кому-нибудь void-свойства. С другой стороны, зачем искуственно ограничивать язык.
Я неверно сформулировал. Это конечно же особенности clr, просто C# их унаследовал, а F# абстрагировал, унифицировав поведение. Сами void-свойства никакой роли не играют, наличие и отсутствие проблем не создают. Просто я сторонник единообразного поведения, потому отвечая NN, хотя сказать, что void-свойства в Nemerle следуют общей идее "все является выражением" и попытка сделать как в C# выглядела бы коряво.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.