Что нужно добавить в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.02.13 23:56
Оценка: 3 (1)
Небольшое вступление.
Сейчас сложилась такая ситуация, что для следующего релиза C# нет big thing, т.е. основной фичи, вокруг которой строится весь релиз (типа linq в 3 версии, динамиков в 4 и асинка в 5). Благодаря этому появилась возможность реализовать кучу мелких вещей, которые, с одной стороны, не требуют революций в языке их их можно реализовать сравнительно разумным объемом ресурсов, а с другой способны сильно облегчить жизнь.
Поэтому у меня есть желание сформировать некий документ со списком фич и отдать его дизайнерам шарпа. Гарантии, что хоть что то из него будет реализовано нет никакой, но шансы этого высоки как никогда
Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам. Желательно раскрыть мысль поподробнее. Идеально было бы привести гипотетический пример исходного кода с описанием его семантики, и потом примерный код на текущем шарпе, в который первый пример должен раскрываться.
Проголосовать за конкретные фичи можно здесь
Автор: AndrewVK
Дата: 19.02.13
Вопрос: Какие возможности, не требующие революционных переделок, вам бы хотелось видеть в C#?
.
... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
AVK Blog
Re: Что нужно добавить в C#?
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.02.13 00:00
Оценка: 4 (2) +2 -1 :)
Все очень и очень просто: Java-way — работа на *NIX-ах из коробки
Re[2]: Что нужно добавить в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.02.13 00:02
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Все очень и очень просто: Java-way — работа на *NIX-ах из коробки


При чем тут компилятор шарпа? Это вопрос к CLR.
... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: Что нужно добавить в C#?
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.02.13 00:05
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>При чем тут компилятор шарпа? Это вопрос к CLR.


Ну, это как сказать. С одной стороны да. С другой стороны, CLR — это в первую очередь C#, так же как JVM это в первую очередь Java. Они неразрывно связанны и обсуждение одного в отрыве от второго бессмысленно.
Re[4]: Что нужно добавить в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.02.13 00:09
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>Ну, это как сказать.


Как ни говори — в контексте данного вопроса это точно обсуждать смысла нет.

KP>С другой стороны, CLR — это в первую очередь C#


Я бы так не сказал. В любом случае — изменения в CLR это уже точно революция, и это другая команда. И вообще это больше политика, нежели технический вопрос.
... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
AVK Blog
Re: Что нужно добавить в C#?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 19.02.13 00:31
Оценка: 62 (9) +10
Здравствуйте, AndrewVK, Вы писали:

Мне в Шарпе не хватает одной фичи из Немерле: foreach c индексатором, типа:

foreach (var x from collection with i)

Здесь i номер текущей итерации.
Ce n'est que pour vous dire ce que je vous dis.
Re: Что нужно добавить в C#?
От: Gollum Россия  
Дата: 19.02.13 00:37
Оценка: 2 (2) +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам.


Если брать мелочи, мне было бы интересно видеть более удобную работу со строками а-ля питон.

Вот например, (псевдо)код на питоне (копипаста из документации)

word = 'HelpA'

>>> word[2:4]
'lp'

>>> word[:2]
'He'

>>> word[2:]
'lpA'

>>> word[-1]     # The last character
'A'
>>> word[-2]     # The last-but-one character
'p'
>>> word[-2:]    # The last two characters
'pA'
>>> word[:-2]    # All but the last two characters
'Hel'


Потом можно прицениться к спискам
Eugene Agafonov on the .NET

Re: Что нужно добавить в C#?
От: Цыба Украина  
Дата: 19.02.13 01:24
Оценка: 6 (1) +1 :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Небольшое вступление.

AVK>Сейчас сложилась такая ситуация, что для следующего релиза C# нет big thing, т.е. основной фичи, вокруг которой строится весь релиз (типа linq в 3 версии, динамиков в 4 и асинка в 5). Благодаря этому появилась возможность реализовать кучу мелких вещей, которые, с одной стороны, не требуют революций в языке их их можно реализовать сравнительно разумным объемом ресурсов, а с другой способны сильно облегчить жизнь.
AVK>Поэтому у меня есть желание сформировать некий документ со списком фич и отдать его дизайнерам шарпа. Гарантии, что хоть что то из него будет реализовано нет никакой, но шансы этого высоки как никогда
AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам. Желательно раскрыть мысль поподробнее. Идеально было бы привести гипотетический пример исходного кода с описанием его семантики, и потом примерный код на текущем шарпе, в который первый пример должен раскрываться.
AVK>Проголосовать за конкретные фичи можно здесь
Автор: AndrewVK
Дата: 19.02.13
Вопрос: Какие возможности, не требующие революционных переделок, вам бы хотелось видеть в C#?
.


Вряд ли скажу big thing, но мелкие доработки были бы очень даже неплохи. Сам начинал с C#, потом судьба забросила на Java, и могу сказать, что оба языка прекрасны, и всё же C#-у стоило бы позаимствовать некоторые Java-фишки.


А если big thing, то, наверное, макросы.
Re[2]: Что нужно добавить в C#?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.02.13 01:32
Оценка:
Здравствуйте, Цыба, Вы писали:

Ц>литералы для регулярок


По поводу этого Мэдс сегодня сказал примерно следующее: You mean literal of the day?
... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: Что нужно добавить в C#?
От: Цыба Украина  
Дата: 19.02.13 01:39
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>По поводу этого Мэдс сегодня сказал примерно следующее: You mean literal of the day?


Есть "покруче".
Re[4]: Что нужно добавить в C#?
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 19.02.13 02:16
Оценка: :)
Здравствуйте, Цыба, Вы писали:

Ц>Есть "покруче".


ААА! Вот откуда эту идею в Rust притащили
Re[5]: Что нужно добавить в C#?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 19.02.13 02:22
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>ААА! Вот откуда эту идею в Rust притащили


В Немерле было раньше.
Ce n'est que pour vous dire ce que je vous dis.
Re: Что нужно добавить в C#?
От: Sinix  
Дата: 19.02.13 05:48
Оценка: 112 (3)
Здравствуйте, AndrewVK, Вы писали:

AVK>Небольшое вступление.

AVK>Сейчас сложилась такая ситуация, что для следующего релиза C# нет big thing, т.е. основной фичи, вокруг которой строится весь релиз (типа linq в 3 версии, динамиков в 4 и асинка в 5). Благодаря этому появилась возможность реализовать кучу мелких вещей, которые, с одной стороны, не требуют революций в языке их их можно реализовать сравнительно разумным объемом ресурсов, а с другой способны сильно облегчить жизнь.
AVK>Поэтому у меня есть желание сформировать некий документ со списком фич и отдать его дизайнерам шарпа. Гарантии, что хоть что то из него будет реализовано нет никакой, но шансы этого высоки как никогда

Последнее, что я слышал — все по уши застряли в Рослине, сильно сомневаюсь, что у них хватит сил на что-то ещё. Из мелочей в голову приходит только вот это:

1. По аналогии с [CallerMemberName] и прочими — [ArgExpression]: текст выражения в заданном атрибуте:
public static void AssertFileExists(string filePath, [ArgExpression("filePath")] argName = "")
{
  if (!File.Exists(filePath))
    throw new ArgumentException(argName, "...");
}

// ...
  AssertFileExists(someClass.SomePath); // throws ArgumentException, argument name = "someClass.SomePath"


2. Явный duck typing, что то вида
  class A { SomeMethod(); } // Чужая сборка.
  interface IB { SomeMethod(); }

// ...
  var a = new A()
  var b = a mapas IB; // синтаксис - первый пришедший в голову. Всё разруливается в compile time - генерится обёртка, строчка превращается в b = new <>c__Wrapper_A_IB(a).

Для скриптов (раз уж у нас шарп в ближайшем будущем можно будет хостить) можно дополнить анонимные типы до того, что есть в яве и добавить возможность передавать анонимные типы шарпа за границы метода (пускай и только для internal/protected-методов).

Но, опять-таки, если рослин допилят, такие мелочи можно будет сделать и самому, благо возможностей выше крыши. Code rewrite, AOP, рефакторинг, code analysis, script hosting — имхо, вполне тянет на big thing.

Ещё, судя по полунамёкам Липперта (сейчас не найду, но было ещё в паре статей), compiler team периодически думает над добавлением явного маппинга "ключевое слово — вызов подходящего метода", как это сделано для linq/foreach/await. Выглядит интересно, но насколько оно будет полезно на практике —
Re: Let/where
От: Qbit86 Кипр
Дата: 19.02.13 05:59
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Благодаря этому появилась возможность реализовать кучу мелких вещей, которые, с одной стороны, не требуют революций в языке их их можно реализовать сравнительно разумным объемом ресурсов, а с другой способны сильно облегчить жизнь.

AVK>Поэтому у меня есть желание сформировать некий документ со списком фич и отдать его дизайнерам шарпа. Гарантии, что хоть что то из него будет реализовано нет никакой, но шансы этого высоки как никогда :)
AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам. Желательно раскрыть мысль поподробнее. Идеально было бы привести гипотетический пример исходного кода с описанием его семантики, и потом примерный код на текущем шарпе, в который первый пример должен раскрываться.

Хочу какой-нибудь синтаксический сахар для let/where: http://bik-top.livejournal.com/50984.html
Глаза у меня добрые, но рубашка — смирительная!
Re: Что нужно добавить в C#?
От: IT Россия linq2db.com
Дата: 19.02.13 06:10
Оценка: 36 (3) +6 :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Проголосовать за конкретные фичи можно здесь
Автор: AndrewVK
Дата: 19.02.13
Вопрос: Какие возможности, не требующие революционных переделок, вам бы хотелось видеть в C#?
.


— Вывод типов при вызове констркуторов.
— nameof/infoof и т.п.
— приделать к query comprehensions to list, to array, first, single, top, skip и т.п.
— ПМ и АТД.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Что нужно добавить в C#?
От: k0st1x Марс  
Дата: 19.02.13 06:29
Оценка:
Здравствуйте, IT, Вы писали:

IT>- Вывод типов при вызове констркуторов.

+100
Re: Что нужно добавить в C#?
От: Jack128  
Дата: 19.02.13 06:47
Оценка: -1
Здравствуйте, AndrewVK, Вы писали:

если из мелких фич, то
1) сплайс строк

var i = 10;
$"Int = $i";



2) чуть по продвинутей вывод дженерик аргументов


TResult Method<TArg, TResult>(TArg arg)  { return default(TResult); }
...
var res = Method<, string>(10); // TArg выведется.



var list = new List<>{10};




А если покупнее, то ПМ
Re: Что нужно добавить в C#?
От: k0st1x Марс  
Дата: 19.02.13 06:48
Оценка:
- Expression Substitution вместо string.Format
var x = 5;
Console.WriteLine("x = #{x}"));


— extension метод .ForEach для IEnumerable
— просто ради красоты — возможность писать код без ";" в конце каждой строчки : )

и, как уже указал "IT" в http://www.rsdn.ru/forum/dotnet/5074746.1
Автор: IT
Дата: 19.02.13

— Вывод типов при вызове констркуторов
Re[2]: Что нужно добавить в C#?
От: k0st1x Марс  
Дата: 19.02.13 06:52
Оценка:
Здравствуйте, IT, Вы писали:

IT>- ПМ и АТД.


дико извиняюсь, что такое "ПМ" и что такое "АТД"?
Re[2]: Что нужно добавить в C#?
От: Аноним  
Дата: 19.02.13 06:54
Оценка:
Здравствуйте, Цыба, Вы писали:

Ц>Небезысвестный Jon Skeet уже как семь лет назад говорил о таком. Компилятор справился бы с перечислениями, я думаю, без изменения CLR.


При всем моем уважении к Скиту, его идея супернавороченных enum'ов мне не нравится. Что чаще всего надо? Парсинг и прочие конвертеры привязать к enum'у, чтобы не болтались в левых классах типа Utils. То есть, если иметь возможность добавить статические методы, этого более чем достаточно. Объявлять enum каким-то class enum совсем не надо. Ну, или, если хочется иметь методы .To(), можно сделать как в мутаторах — в контексте нестатических методов enum'а считать value ключевым словом.

Все остальное решается через наследование. Наследуйся, там добавишь все, что надо. Примерно, как от класса с одним целочисленным полем. Соответственно, доступ к значению через то же самое base.value.
Re[2]: Что нужно добавить в C#?
От: Jack128  
Дата: 19.02.13 06:56
Оценка:
Здравствуйте, Jack128, Вы писали:

А, и еще не знаю насколько это "крупно", но очень хочется возможность комбинирования expression-trees


Expression<Func<int?, string>> ToStr = i => i.HasValue ? i.ToString() : "null";
var q = db.MyTables.Select(rec => rec.StrField + ToStr(rec.IntField));



если не ошибаюсь в F# есть такая фича.
Re: Что нужно добавить в C#?
От: AK85 Беларусь  
Дата: 19.02.13 07:07
Оценка: 7 (2) +3
Здравствуйте, AndrewVK, Вы писали:

AVK>те фичи, которых не хватает лично вам.


r = a.?b.?c;

вместо
if (a != null && a.b != null)
    r = a.b.c;
else
    r = null;


Это кажется называется Maybe monad.
Синтаксис подсмотрен у Bart de Smet.
Re: Что нужно добавить в C#?
От: k0st1x Марс  
Дата: 19.02.13 07:08
Оценка: 6 (1) +1
было бы здорово иметь возможность писать

interface IFoobar { void DoWork(); }
...
object value;
if(value is IFoobar) {
  value.DoWork(); // не надо делать "cast" или "as"
}
Re[3]: Что нужно добавить в C#?
От: Аноним  
Дата: 19.02.13 07:08
Оценка:
K>дико извиняюсь, что такое "ПМ" и что такое "АТД"?
по всей видимости, паттерн матчинг и алгебраические типы данных.
Re: Что нужно добавить в C#?
От: k0st1x Марс  
Дата: 19.02.13 07:13
Оценка: 3 (1) +4
Здравствуйте, AndrewVK

еще вот на ходу вспоминаю, чего не хватает
— default value для auto property

: )
Re[2]: Что нужно добавить в C#?
От: Jack128  
Дата: 19.02.13 07:35
Оценка: +1
Здравствуйте, AK85, Вы писали:

AK>Здравствуйте, AndrewVK, Вы писали:


AVK>>те фичи, которых не хватает лично вам.


AK>
AK>r = a.?b.?c;
AK>

AK>вместо
AK>
AK>if (a != null && a.b != null)
AK>    r = a.b.c;
AK>else
AK>    r = null;
AK>


AK>Это кажется называется Maybe monad.

AK>Синтаксис подсмотрен у Bart de Smet.

Туда же NotNull ссылки. Но это уже CLR -(
Re: Что нужно добавить в C#?
От: AlexRK  
Дата: 19.02.13 07:48
Оценка: 6 (1) +1
Здравствуйте, AndrewVK, Вы писали:

1. Not null ссылки, желательно по умолчанию.
2. Алгебраические типы данных.
3. Паттерн-матчинг — в том числе по обычным типам.
Re: Что нужно добавить в C#?
От: xorets  
Дата: 19.02.13 07:50
Оценка: 1 (1) +1
Мне кажется, полезна будет возможность использовать initializer block после любого выражения, возвращающего объект, а не только после операции new. Это особенно полезно при использовании DI-контейнеров, которые, вроде как, логически замещают new, но полного синтаксиса не предоставляют.

Например, так:

var o = container.Resolve<MyObject>() 
   {
      Field1 = 7,
      Field2 = "hello world"
   };
Re[2]: Что нужно добавить в C#?
От: xorets  
Дата: 19.02.13 07:53
Оценка: +1
Ц>* Сигнатурные ограничения для конструкторов обобщённых типов: не просто конструктор по умолчанию, а возможность указать желаемую сигнатуру конструктора объекта. Например, для инджектирования объекта через конструктор, а не через свойства -- раз и до конца жизни объекта.

Очень поддерживаю. Нужна возможность декларировать интерфейс создания семейства объектов.
Re[3]: Что нужно добавить в C#?
От: Цыба Украина  
Дата: 19.02.13 08:09
Оценка:
Здравствуйте, xorets, Вы писали:

X>Очень поддерживаю. Нужна возможность декларировать интерфейс создания семейства объектов.


Это просто идея, и я не уверен в её состоятельности. Я на самом деле очень люблю неизменяемые типы, но таким образом даже от левого класса нужна поддержка такого специфического конструирования объекта, хотя это забота уже самого типа. Поведение принято решать через методы интерфейсов. Быть может, здесь лучше использовать фабрику объектов, которая знает как создать неизменяемый объект?
Re[2]: Что нужно добавить в C#?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.02.13 12:45
Оценка: 1 (1) +5 -1 :))) :))) :))
Здравствуйте, Don Reba, Вы писали:

DR>
foreach (var x from collection with i)

DR>Здесь i номер текущей итерации.

А... раз пошла такая пьянка, то можно и остальные фичи из Немерла реализовать .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Что нужно добавить в C#?
От: Цыба Украина  
Дата: 19.02.13 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>При всем моем уважении к Скиту, его идея супернавороченных enum'ов мне не нравится. Что чаще всего надо? Парсинг и прочие конвертеры привязать к enum'у, чтобы не болтались в левых классах типа Utils. То есть, если иметь возможность добавить статические методы, этого более чем достаточно. Объявлять enum каким-то class enum совсем не надо. Ну, или, если хочется иметь методы .To(), можно сделать как в мутаторах — в контексте нестатических методов enum'а считать value ключевым словом.


А>Все остальное решается через наследование. Наследуйся, там добавишь все, что надо. Примерно, как от класса с одним целочисленным полем. Соответственно, доступ к значению через то же самое base.value.


Мутно как-то. В Java, кроме того, такие перечисления можно использовать в аннотациях (аттрибутах в терминологии C#).
Re[2]: Что нужно добавить в C#?
От: Jack128  
Дата: 19.02.13 13:08
Оценка: +1
Здравствуйте, k0st1x, Вы писали:

K>было бы здорово иметь возможность писать


K>
K>interface IFoobar { void DoWork(); }
K>...
K>object value;
K>if(value is IFoobar) {
K>  value.DoWork(); // не надо делать "cast" или "as"
K>}
K>


Уже существующим синтаксисом не обойтись, нужно новый придумывать, иначе такая фича поломает обратную совместимость.


interface IMyIntf 
{
    void IntfMethod();
}
class MyClass: IMyIntf
{
   public void ClassMethod() {}
   void IMyIntf.IntfMethod() {}
}


IMyIntf o = ...;
if (o is MyClass)
{
    o.IntfMethod(); // сейчас работает, а если o скастится к MyClass, то перестанет компилиться.
}
Re[3]: Что нужно добавить в C#?
От: k0st1x Марс  
Дата: 19.02.13 13:19
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, k0st1x, Вы писали:


K>>было бы здорово иметь возможность писать


K>>
K>>interface IFoobar { void DoWork(); }
K>>...
K>>object value;
K>>if(value is IFoobar) {
K>>  value.DoWork(); // не надо делать "cast" или "as"
K>>}
K>>


J>Уже существующим синтаксисом не обойтись, нужно новый придумывать, иначе такая фича поломает обратную совместимость.


вообще, идею увидел в проекте Kotlin.
jetbrains как-то живет с такой фичей
Re[4]: Что нужно добавить в C#?
От: Аноним  
Дата: 19.02.13 13:21
Оценка:
Здравствуйте, Цыба, Вы писали:

Ц>Здравствуйте, Аноним, Вы писали:


А>>При всем моем уважении к Скиту, его идея супернавороченных enum'ов мне не нравится. Что чаще всего надо? Парсинг и прочие конвертеры привязать к enum'у, чтобы не болтались в левых классах типа Utils. То есть, если иметь возможность добавить статические методы, этого более чем достаточно. Объявлять enum каким-то class enum совсем не надо. Ну, или, если хочется иметь методы .To(), можно сделать как в мутаторах — в контексте нестатических методов enum'а считать value ключевым словом.


А>>Все остальное решается через наследование. Наследуйся, там добавишь все, что надо. Примерно, как от класса с одним целочисленным полем. Соответственно, доступ к значению через то же самое base.value.


Ц>Мутно как-то. В Java, кроме того, такие перечисления можно использовать в аннотациях (аттрибутах в терминологии C#).


Я не понимаю, что значит "мутно".

Я исхожу из реальной проблемы: часто встречаешь набор функций, которые относятся только к enum'у, но хостятся в классе Utils, Converters и т.п. Если их можно было бы засунуть в сам enum, было бы понятно:

public enum LengthUnit
{
    Millimeter = 1,
    Meter = 1000,
    Inch = 25400;

    public static LengthUnit Parse(string text)
    {
        if (text == "mm") return LengthUnit.Millimeter;
        if (text == "m") return LengthUnit.Meter;
        if (text == "\"") return LengthUnit.Inch;
    }

    public string GetSystem()
    {
        switch (value)
        {
            case LengthUnit.Millimeter:
            case LengthUnit.Meter:
                return "Metric";
            case LengthUnit.Inch:
                return "US";
            default: return string.Empty;
        }
    }
}

...

var system = LengthUnit.Parse("mm").GetSystem();


Какие проблемы у Скита решаются с помощью class enum мне понять вообще не удалось.

То есть, я боюсь, что если и сделают енамы более объектными, то вместо маленького нужного инструмента зафигачат большой и ненужный. Если кому-то нужен класс и enum в одном флаконе, пусть пишет, как в PHP, то есть, класс с константами, с методами, конструкторами и прочим. А чтобы не копипастить код, когда уже есть enum, а свой такой класс надо построить на его базе, вполне достаточно поддержать наследование. И наследование самих enum'ов, конечно. Тоже не хватает, чтобы, допустим, от enum'а с секундой унаследовать как СИ, так и грамм-секундную систему. И чтобы секунда там и там была одной и той же.
Re[4]: Что нужно добавить в C#?
От: k0st1x Марс  
Дата: 19.02.13 13:21
Оценка:
Здравствуйте, k0st1x, Вы писали:

K>Здравствуйте, Jack128, Вы писали:


J>>Здравствуйте, k0st1x, Вы писали:


K>>>было бы здорово иметь возможность писать


K>>>
K>>>interface IFoobar { void DoWork(); }
K>>>...
K>>>object value;
K>>>if(value is IFoobar) {
K>>>  value.DoWork(); // не надо делать "cast" или "as"
K>>>}
K>>>


J>>Уже существующим синтаксисом не обойтись, нужно новый придумывать, иначе такая фича поломает обратную совместимость.


K>вообще, идею увидел в проекте Kotlin.

K>jetbrains как-то живет с такой фичей

кстати, здесь описание этой фичи
до этой минуты даже не догадывался, что это называется "Pattern matching" )
Re[4]: Что нужно добавить в C#?
От: hardcase Пират http://nemerle.org
Дата: 19.02.13 13:26
Оценка: +1
Здравствуйте, k0st1x, Вы писали:

K>вообще, идею увидел в проекте Kotlin.

K>jetbrains как-то живет с такой фичей

У Kotlin проблема обратной совместимости ещё не стоит, и до первого официального релиза можно синтаксисом крутить и вертеть как угодно.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Что нужно добавить в C#?
От: _FRED_ Черногория
Дата: 19.02.13 13:33
Оценка: 38 (2) +1
Здравствуйте, AndrewVK, Вы писали:

Порядок значения не имеет, что вспомнилось.

  • Уточнение типа не хватает. Сейчас:
    // Тип переменной - массив, а хотелось бы иметь IList<int> или даже IReadOnlyCollection<int>.
    var list1 = new int[] { 0, };
    
    // Явное указание типа переменной - выход, но смотрится не симпатично когда кругом (выше и ниже по коду) var-ы,
    // а так же не возможно в выражении let внутри query
    IList<int> list2 = new int[] { 0, };
    
    // Приведение типа не выглядит как безопасная операция.
    // Внимание при чтении концентрируется на типе, а не на выражении, которое важнее.
    var list3 = (IList<int>)new int[] { 0, };


    С уточнением типов:
    var list = new int[] { 0, } : IList<int>;
    var predicate = item => item > 3 : Func<int, bool>; // Можно ещё и так использовать, да.


  • Как уже скзали, расширение query для возможности естественного вызова Aggregate/Skip/etc (например как в VB) + поддержка пользовательских расширений.
    Например сейчас:
    var temp =
      from item in collection
      where item.Some > 3
      select item;
    var x1 = new MyCollection<X>(temp, someAdditionalParameter: 42);
    var x2 = temp.ToMyDictionary(item => item.Key, item => item.Data);
    var x3 = temp.Percentile(0.95);


    Хотелось бы:
    // Вызов конструктора
    var x1 =
      from item in collection
      where item.Some > 3
      select item into temp as new MyCollection<X>(temp, someAdditionalParameter: 42);
    
    // Просто вызов некоего метода
    var x2 =
      from item in collection
      where item.Some > 3
      select item into temp as MyExtensions.ToMyDictionary(temp, item => item.Key, item => item.Data);
    
    // Вызов метода-расширения
    var x3 =
      from item in collection
      where item.Some > 3
      select item into temp as temp.Percentile(0.95);

    Тип переменной "х" — это тип выражения после "as". Так же получится удобное использование First[OrDefault] и т.п. если не придумают, как эти методы более естественно внедрить в query.

  • Так же реквестую nameof/infoof и "ПМ и АТД"

  • Синтаксис для простого написания имутабельных типов и билдеров к ним, если эту задачу нельзя не будет решить с появлением Розлина.

  • Лямбда и моджификаторы параметра (ref/out)
    Автор: _FRED_
    Дата: 22.06.11

    private delegate bool TryParse<T>(string text, out T result);
    // Так можно
    TryParse<int> parse1 = (string text, out int result) => Int32.TryParse(text, out result);
    // А хотелось бы и так
    TryParse<int> parse2 = (text, out result) => Int32.TryParse(text, out result);


  • Полная поддержка компилятором Expression, в ветвлениями и прочим. Поддержка в выражениях подстановок. Хотя бы так:
    Expression<Func<int, int>> temp = value => value + 10;
    Expression<Func<int, int>> lambda = value => {
      if(value % 2 == 0) {
        return 10;
      } else if(value < 100) {
        return 20;
      } else {
        return #temp(value); // тут компилятор встраивает под-дерево temp.
      }//if
    };


  • using-директива c открытыми дженерик-типами:
    using MyMap<TKey, TValue> = IDictionary<TKey, IList<TValue>>;

    а так же using-директива внутри класса (для использования там объявленных в классе дженерик-типов).

  • Контракты на декларативном уровне а-ля Spec# http://research.microsoft.com/en-us/projects/specsharp/
  • Help will always be given at Hogwarts to those who ask for it.
    Re[2]: Что нужно добавить в C#?
    От: _FRED_ Черногория
    Дата: 19.02.13 13:35
    Оценка:
    Здравствуйте, _FRED_, Вы писали:

    _FR>Порядок значения не имеет, что вспомнилось.


    Да, за оператор .? тоже громко реквестую.
    Help will always be given at Hogwarts to those who ask for it.
    Re: Что нужно добавить в C#?
    От: koodeer  
    Дата: 19.02.13 13:41
    Оценка: +3
    Здравствуйте, AndrewVK.

    Хотелось бы иметь ограничение дженериков как простых типов, чтобы можно было реализовывать быстрые вычисления.
    Что-то вроде:

    T Calc<T>(T a, T b) where T : simple // позразумеваются int, byte, double, etc
    {
        T result = a + b; // разрешено использовать + - * /
    
        return result;
    }


    Но это нужна доработка CLR.
    Re: Что нужно добавить в C#?
    От: ionoy Эстония www.ammyui.com
    Дата: 19.02.13 15:19
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    1. АТД и ПМ
    2. Довести поддержку локальных функций до уровня Немерле
    3. Туплы, встроенные в язык
    www.livexaml.com
    www.ammyui.com
    www.nemerleweb.com
    Re: Что нужно добавить в C#?
    От: agat50  
    Дата: 19.02.13 15:50
    Оценка:
    Мнение ламера. Как мейнстримовый язык шарп почти идеален, Roslyn видимо позволит фишек по части синтаксиса добавить. А вот по части кроссплатформенности\оперсорса джавe проигрывает конечно. На много серверов винду не поставишь увы, и под себя не перепишешь то, что не особенно нравится\баг пофиксить быстро. И имхо, для этого нужно более активное участие самой Microsoft. За код спасибо, но WPF, например, могли сделать не на directx, а на том же opengl, и всё стало бы чуть проще по части GUI. Ну и вообще какой-то бред, когда в Mono приходится переписывать то, что уже написано в MS.
    Re[5]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.02.13 15:59
    Оценка:
    Здравствуйте, kaa.python, Вы писали:

    Ц>>Есть "покруче".

    KP>ААА! Вот откуда эту идею в Rust притащили

    Гы-гы (2005-й год). Думаю, что и до этого где-то было.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[2]: Что нужно добавить в C#?
    От: Aлeкceй  
    Дата: 19.02.13 16:00
    Оценка:
    Здравствуйте, agat50, Вы писали:

    A>Мнение ламера. Как мейнстримовый язык шарп почти идеален, Roslyn видимо позволит фишек по части синтаксиса добавить. А вот по части кроссплатформенности\оперсорса джавe проигрывает конечно. На много серверов винду не поставишь увы, и под себя не перепишешь то, что не особенно нравится\баг пофиксить быстро. И имхо, для этого нужно более активное участие самой Microsoft. За код спасибо, но WPF, например, могли сделать не на directx, а на том же opengl, и всё стало бы чуть проще по части GUI. Ну и вообще какой-то бред, когда в Mono приходится переписывать то, что уже написано в MS.


    А что мешает моно на сервер поставить?

    А по теме: ПМ, АТД, кортежи, встроенные в язык и индексаторы в foreach.
    Re[3]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.02.13 16:10
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>дико извиняюсь, что такое "ПМ" и что такое "АТД"?


    Агебраические типы данных (ака Варианты или ограниченные объеденения) и сопоставление по ним.

    http://nemerle.org/wiki/Grok_Variants_and_matching
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: Что нужно добавить в C#?
    От: Аноним  
    Дата: 19.02.13 16:13
    Оценка: -2
    Сделайте union наконец (хотя бы для ссылочных типов)
    Я думаю, что это могло бы быть С# 1.0, но до сих пор почему-то нет...
    Re[2]: Что нужно добавить в C#?
    От: Aлeкceй  
    Дата: 19.02.13 16:14
    Оценка: +3
    Здравствуйте, Аноним, Вы писали:

    А>Сделайте union наконец (хотя бы для ссылочных типов)

    А>Я думаю, что это могло бы быть С# 1.0, но до сих пор почему-то нет...

    Зачем?
    Re[4]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.02.13 16:19
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>вообще, идею увидел в проекте Kotlin.

    K>jetbrains как-то живет с такой фичей

    Там язык с нуля проектировался и другого поведения нет. Кроме того там оно не для всех случаев работает, вроде как. Потому как для изменяемых переменных поведение будет кривым.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: Что нужно добавить в C#?
    От: agat50  
    Дата: 19.02.13 17:11
    Оценка:
    Здравствуйте, Aлeкceй, Вы писали:

    A>А что мешает моно на сервер поставить?


    Мешает то, что банальнейшая прога на winforms .net4.0 c mysql коннектором (который специально под mono) на убунте с 2.10.8.1 вылетает при запуске с замечательной ошибкой " Could not load file or assembly 'MySql.Data, Version=6.5.5.0, ...", которая валяется в той же папке. И какая тут "Yes, Mono is binary compatible with Windows."? Не тянет писать под Mono с его приколами, а не под .net как единую платформу аля java. В принципе всё решаемо, опять-таки java либы через ikvm можно на крайний случай для кроссплатформенности использовать. MS мог бы выпустить CLR под линукс, мб и с покоцанным функционалом типа wpf, хоть серваки гонять, но чтобы работало всё так же как на винде.
    Re[2]: Что нужно добавить в C#?
    От: Ziaw Россия  
    Дата: 19.02.13 17:12
    Оценка: 1 (1) +1
    Здравствуйте, Аноним, Вы писали:

    А>Сделайте union наконец (хотя бы для ссылочных типов)

    А>Я думаю, что это могло бы быть С# 1.0, но до сих пор почему-то нет...

    FieldOffsetAttribute доступен с первого фреймворка.
    Re: Что нужно добавить в C#?
    От: matumba  
    Дата: 19.02.13 17:50
    Оценка: 3 (1) +1 -4
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Сейчас сложилась такая ситуация, что для следующего релиза C# нет big thing


    Их не было и в 5 релизе — ну не async же — революция программазма!

    AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам.


    Забавно — т.е. к народу обращаются только когда ИМ нужно? Я думал, MS просто завален предложениями на десятилетие вперёд! И предложения совсем не обязательно должны быть big thing — даже элементарные вещи могут делать жизнь прогера намного легче. Ладно, раз уж дали высказаться, нате вам:

    1. Авто-инициализация авто-проперти:
      int a {get;set;} = 7;
      Это мелочи, но без них ШАРП БЕСИТ!
    2. Автопроперть тоже сократить до: prop int a; // паблик проперть для r/w; куча приложений идёт именно с таким дефолтом, почему б его не сократить? Заодно ускорится компиляция.
    3. Мультиприсвоение: var (a, b) = GetCoords(); // в a и b попадают отдельные числа. Т.е. типа кортежа, но без кортежа. Перл это умеет на раз-два. Сишарп ждём уже 10 лет....
    4. Ещё один вид мультистрочных каментов (а-ля D): /+ это отладочный коммент /* скрывающий рабочий коммент */ и нужный только временно +/
    5. Раз уж строки являются "немного встроенным" и широко используемым типом, нельзя ли упростить дебилизм типа if (!string.IsNullOrWhiteSpace(бла-бла...)) на что-то типа if (^string_var) — это сократило бы целую кучу кода.
    6. Вывод типов для филдов: var SomeField = 6; // знаю, есть проблемы, но они трясут в 0.000001% случаев — так не лучше ли сделать жизнь большинства легче?!
    7. Если тип переменной уже известен, пересоздавать её простым способом:
      File f; ...где-то позже... f = new();
      — бенефит очевиден при использовании всяких трёхэтажных генериков.
    8. .ToString() бесит. Можно как в Руби: obj.ToS ? (заметьте — без скобок)
    9. Синонимы функций. Console.WriteLine задолбал — хочу типа так:
      using Out = Console.WriteLine; Out(bzbz);

    10. Зачем в switch(SomeEnumVar) пишут в case SomeDamnBigEnumName.EnumValue: ? нельзя ли просто switch(SomeEnumVar) case EnumValue: — тип-то везде один и тот же!
    11. Приведение типов неуклюжее. Вместо
      double z = (double)IntVar;
      можно было б писать
      double z := IntVar;
      , т.е. := — это "присвоить с приведением типа к lvalue". Словесный понос надо искоренять — пусть паскалисты его тыркают.

    Фичи из голосовалки, к которым +100:

    Хочется, чтобы офигевшие от своей крутости шарподелы спустились на землю и не выпежонивались "суперфичами", а слушали тех, кто РЕАЛЬНО использует шарп — это МЫ ежедневно колдыбасимся с их компилером и это нам виднее, что есть "мелочи". А если ради мелочей надо переписывать компилер, то.... в топку такие компилеры.
    Re[2]: Что нужно добавить в C#?
    От: Gollum Россия  
    Дата: 19.02.13 17:51
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>- Вывод типов при вызове констркуторов.

    IT>- приделать к query comprehensions to list, to array, first, single, top, skip и т.п.

    +1

    IT>- nameof/infoof и т.п.

    IT>- ПМ и АТД.

    Ну у вас и мелочи
    Eugene Agafonov on the .NET

    Re[2]: Что нужно добавить в C#?
    От: Jack128  
    Дата: 19.02.13 18:44
    Оценка: +1
    Здравствуйте, matumba, Вы писали:

    M>*Раз уж строки являются "немного встроенным" и широко используемым типом, нельзя ли упростить дебилизм типа if (!string.IsNullOrWhiteSpace(бла-бла...)) на что-то типа if (^string_var) — это сократило бы целую кучу кода.

    ну сделай экстеншн метод if (string_var.A) и кол-ву символов, и по читабельности примерно одинаково.

    M>*Приведение типов неуклюжее. Вместо
    double z = (double)IntVar;
    можно было б писать
    double z := IntVar;
    , т.е. := — это "присвоить с приведением типа к lvalue". Словесный понос надо искоренять — пусть паскалисты его тыркают.

    чем те var z = (double)IntVar не устраивает?
    Re: Что нужно добавить в C#?
    От: matumba  
    Дата: 19.02.13 18:49
    Оценка: -1 :)
    Пробежался по треду и собрал ещё фич, которые поддерживаю (почему-то в голосовалке — мусор вместо дельных пунктов):

    1. Упрощённая работа с атрибутами. Какой смысл рассуждать об их пользе, если работа с ними осущ. через анус? Хочется изящной простоты, типа: foreach(PropInfo pi in WindowType.class.GetProperties(Attr1, attr2, ..)); Или PropInfo.HasAttribute(AttrClass); Вообще, у C# довольно помоечный синтаксис работы с классами: вместо элегантных конструкций с именами типов приходится влезать чуть ли не в ассемблер: Класс.ДайСвойТип().ШаманскиеФункции.... отстой полнейший. Нужен синтаксис сразу на уровне "Класс", типа "Класс.ДайПропертиСАтрибутом(Атрибут)". Это мелочи, но без них код загромождается фуфлом — хорошо бы девелоперам сишарпа заботиться не только "предоставить доступ к фиче", но и о элегантности кода с этими фичами.
    2. Оператор .?
    3. Улучшить оператор AS: нечасто, но изрядно упрощает бойлерплэйт a = b as SomeType; if (a != null) ....; Вариант: when(b = a as SomeType) { юзаем b }
    4. Упрощ. иниц. объекта помимо new: var z = GetObject() <= { filed = 4, field2 = 5 }
    5. Duck typing ака MapAs: приводить объект к интерфейсу, если он совместим по методам. Уж лучше в рантайме всё **нётся, зато в коде можно очень элегантно обруливать всякое гетерогенное фуфло из разных иерархий.
    Re[3]: Что нужно добавить в C#?
    От: matumba  
    Дата: 19.02.13 19:01
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>чем те var z = (double)IntVar не устраивает?


    Тем, что это абсолютно левый пример. Я хочу избавиться от _приведения_типа_, а не замены double на var.
    Re[4]: Что нужно добавить в C#?
    От: Jack128  
    Дата: 19.02.13 19:08
    Оценка: +2
    Здравствуйте, matumba, Вы писали:

    M>Здравствуйте, Jack128, Вы писали:


    J>>чем те var z = (double)IntVar не устраивает?


    M>Я хочу избавиться от _приведения_типа_, а не замены double на var.

    нет, ты предлагаешь заменить один синтаксис приведения другим.
    Re[3]: Что нужно добавить в C#?
    От: IT Россия linq2db.com
    Дата: 19.02.13 19:17
    Оценка:
    Здравствуйте, Gollum, Вы писали:

    IT>>- ПМ и АТД.

    G>Ну у вас и мелочи

    На самом деле если разобраться, то и то и другое — это сахар. АТД — это плоская иерархия, по типу Linq.Expressions только с информацией о соответствии полей/свойст класса с их позиционированием в паттернах для ПМ. Немерле, кстати, умеет задавать такую информацию в том числе и для обычных классов. ПМ — это всего лишь навороченный switch/if с максимально компактным синтаксисом, включающим распаковку структур данных, и умным алгоритмом оптимизации перебора условий.

    Единственное чем ПМ может не вписаться в C# — так это то, что в том же Немерле всё есть выражение и все языковые конструкции могут возвращать значение.
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[3]: Что нужно добавить в C#?
    От: k0st1x Марс  
    Дата: 19.02.13 20:21
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>Здравствуйте, k0st1x, Вы писали:


    K>>было бы здорово иметь возможность писать


    K>>
    K>>interface IFoobar { void DoWork(); }
    K>>...
    K>>object value;
    K>>if(value is IFoobar) {
    K>>  value.DoWork(); // не надо делать "cast" или "as"
    K>>}
    K>>


    J>Уже существующим синтаксисом не обойтись, нужно новый придумывать, иначе такая фича поломает обратную совместимость.



    я тут подумал и не смог придумать, какой сценарий поломает обратную совместимость?
    Re[4]: Что нужно добавить в C#?
    От: Jack128  
    Дата: 19.02.13 20:44
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    J>>Уже существующим синтаксисом не обойтись, нужно новый придумывать, иначе такая фича поломает обратную совместимость.



    K>я тут подумал и не смог придумать, какой сценарий поломает обратную совместимость?


    а тебе придумывать не нужно, я уже придумал. И даже написал этот пример, но ты при цитировании почему то удалил его.
    Re: Что нужно добавить в C#?
    От: aloch Россия  
    Дата: 19.02.13 21:45
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    Оператор with

    with (node)
    {
       .name = "QQ";
       .index = 10;
       .DoSome();
    }



    (именно с точкой перед именем метода или свойства, как в VB)


    Re[2]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 00:16
    Оценка: 24 (1)
    Здравствуйте, Sinix, Вы писали:

    S>Последнее, что я слышал — все по уши застряли в Рослине, сильно сомневаюсь, что у них хватит сил на что-то ещё


    Я не могу озвучивать конкретики, но ситуация несколько иная сейчас.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[2]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 00:26
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>- ПМ и АТД.


    Основная проблема с ПМ, как озвучил Мэдс, в АТД. Это новый first class citizen, который отчасти дублирует существующие сущности в языке. Так что АТД ака discriminated unions на данный момент однозначно no way. Теоретически можно обойтись без АТД существующими типами с какими то дополнительными доработками, но тут нужно говорить более конкретно.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[3]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 00:26
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>Туда же NotNull ссылки.


    Боюсь, для этого нужно написать CLR с нуля
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[2]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 00:26
    Оценка:
    Здравствуйте, koodeer, Вы писали:

    K>Хотелось бы иметь ограничение дженериков как простых типов, чтобы можно было реализовывать быстрые вычисления.


    Это уже несколько лет как одна из самых востребованных фич к рантайму, и про это команде CLR известно, но пока ничего конкретного нет.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[2]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 00:26
    Оценка: +2
    Здравствуйте, matumba, Вы писали:

    AVK>>Сейчас сложилась такая ситуация, что для следующего релиза C# нет big thing

    M>Их не было и в 5 релизе — ну не async же — революция программазма!

    Под революциями я имел в виду масштабные изменения конкретно в C#, а не новые открытия в computer science.

    AVK>>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам.


    M>Забавно — т.е. к народу обращаются только когда ИМ нужно?


    Здесь к народу обращаюсь я, и я в МС не работаю, не переживай.

    M>Хочется, чтобы офигевшие от своей крутости шарподелы спустились на землю и не выпежонивались "суперфичами", а слушали тех, кто РЕАЛЬНО использует шарп — это МЫ ежедневно колдыбасимся с их компилером и это нам виднее, что есть "мелочи". А если ради мелочей надо переписывать компилер, то.... в топку такие компилеры.


    Ты продолжай в таком тоне общаться, и тебя вообще никто слушать не будет.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[5]: Что нужно добавить в C#?
    От: Ziaw Россия  
    Дата: 20.02.13 01:36
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>а тебе придумывать не нужно, я уже придумал. И даже написал этот пример, но ты при цитировании почему то удалил его.


    В принципе это решаемо эвристиками в компиляторе. Так что если очень хочется, то можно.
    Re[2]: Что нужно добавить в C#?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 20.02.13 04:23
    Оценка:
    Здравствуйте, matumba, Вы писали:

    M>Пробежался по треду и собрал ещё фич, которые поддерживаю (почему-то в голосовалке — мусор вместо дельных пунктов):


    M>Упрощённая работа с атрибутами. Какой смысл рассуждать об их пользе, если работа с ними осущ. через анус? Хочется изящной простоты, типа: foreach(PropInfo pi in WindowType.class.GetProperties(Attr1, attr2, ..)); Или PropInfo.HasAttribute(AttrClass);


    При чём тут C#?
    public static IEnumerable<PropInfo> GetProperties<A1, A2>(this Type type) where A1: Attribute, A2: Attribute { ... }
    public static bool HasAttribute<A1>(this PropInfo pi) where A: Attribute {...};
    foreach(var pi in typeof(WindowType).GetProperties<Attr1, attr2>())
      if (pi.HasAttribute<Attr1>())
        ...


    M>Вообще, у C# довольно помоечный синтаксис работы с классами: вместо элегантных конструкций с именами типов приходится влезать чуть ли не в ассемблер: Класс.ДайСвойТип().ШаманскиеФункции.... отстой полнейший. Нужен синтаксис сразу на уровне "Класс", типа "Класс.ДайПропертиСАтрибутом(Атрибут)". Это мелочи, но без них код загромождается фуфлом — хорошо бы девелоперам сишарпа заботиться не только "предоставить доступ к фиче", но и о элегантности кода с этими фичами.

    M>Оператор .?
    M>Улучшить оператор AS: нечасто, но изрядно упрощает бойлерплэйт a = b as SomeType; if (a != null) ....; Вариант: when(b = a as SomeType) { юзаем b }
    public static void WhenIs<T>(this object o, Action<T> action) { 
      if (Typeof(T).IsAssignableFrom(o.GetType()))
        action((T)o);
    }
    a.WhenIs<SomeType>{b=>юзаем b }


    M>Упрощ. иниц. объекта помимо new: var z = GetObject() <= { filed = 4, field2 = 5 }

    Зачем?
    M>Duck typing ака MapAs: приводить объект к интерфейсу, если он совместим по методам. Уж лучше в рантайме всё **нётся, зато в коде можно очень элегантно обруливать всякое гетерогенное фуфло из разных иерархий.
    Реализовано в библиотеках — BLToolkit смотрели?
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re: Что нужно добавить в C#?
    От: Философ Ад http://vk.com/id10256428
    Дата: 20.02.13 05:13
    Оценка:
    заголовочного раздела в классе.

    хотелось бы сразу после открытия файла видеть, какие public и protected методы в нём описаны.
    Всё сказанное выше — личное мнение, если не указано обратное.
    Re[2]: Что нужно добавить в C#?
    От: Mihas  
    Дата: 20.02.13 05:32
    Оценка: +1 :)
    Здравствуйте, k0st1x, Вы писали:

    K> — просто ради красоты — возможность писать код без ";" в конце каждой строчки : )

    Тогда придется спилить безымянный палец. Чтоб не стучал по клавише ;
    Re[3]: Что нужно добавить в C#?
    От: k0st1x Марс  
    Дата: 20.02.13 05:47
    Оценка:
    Здравствуйте, Mihas, Вы писали:

    M>Здравствуйте, k0st1x, Вы писали:


    K>> — просто ради красоты — возможность писать код без ";" в конце каждой строчки : )

    M>Тогда придется спилить безымянный палец. Чтоб не стучал по клавише ;

    как временное решение или workaround,
    можно примотать мизинец к безымянному пальцу, ну или приклееть суперклеем.
    Re[5]: Что нужно добавить в C#?
    От: k0st1x Марс  
    Дата: 20.02.13 05:49
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>Здравствуйте, k0st1x, Вы писали:


    J>>>Уже существующим синтаксисом не обойтись, нужно новый придумывать, иначе такая фича поломает обратную совместимость.



    K>>я тут подумал и не смог придумать, какой сценарий поломает обратную совместимость?


    J>а тебе придумывать не нужно, я уже придумал. И даже написал этот пример, но ты при цитировании почему то удалил его.


    извиняюсь, действительно упустил.
    btw, проверил этот сценарий в котлине — он ругается и не дает скомпилить.
    Re[3]: Что нужно добавить в C#?
    От: Sinix  
    Дата: 20.02.13 05:51
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    S>>Последнее, что я слышал — все по уши застряли в Рослине, сильно сомневаюсь, что у них хватит сил на что-то ещё

    AVK>Я не могу озвучивать конкретики, но ситуация несколько иная сейчас.

    Ок, значит отстал от жизни. Удачи им
    Re: Что нужно добавить в C#?
    От: HowardLovekraft  
    Дата: 20.02.13 06:09
    Оценка: :)
    Здравствуйте, AndrewVK, Вы писали:

    AVK>skipped


    Добавлю свои 5 копеек:

    1) switch по всему, чему угодно, очень надоело писать костыли в виде словарей. Т.е., вместо, например, этого:

        class A
        {
            private readonly Dictionary<Type, Action> helpers;
    
            public A()
            {
                this.helpers = new Dictionary<Type, Action>
                {
                    // инициализация какими-то значениями
                };
            }
    
            public void Foo()
            {
                var type = someObject.GetType();
    
                helpers[type]();
            }
        }


    писать так:

        class A
        {
            public void Foo()
            {
                var someVar = //...
                var type = someObject.GetType();
    
                switch (type)
                {           
                    case typeof(string):
                        break;
                    case typeof(A):
                        break;
                    case someVar.GetType():
                        break;
                }
            }
        }


    Пусть это все разворачивается в тот же Dictionary, но типовым и однообразным способом.

    2) [PropertyChanging] и [PropertyChanged] для автосвойств искаропки:

            [PropertyChanging]
            [PropertyChanged]
            public int MyProperty { get; set; }


    3) Разрешить инициализатору поля ссылаться на экземплярный метод, поле или свойство, сейчас вместо этого приходиться городить конструктор:

            private readonly Lazy<string> someLazy = new Lazy<string>(SomeLazyFactory);
    
            private string SomeLazyFactory()
            {
                return string.Empty;
            }


    4) Разрешить использовать экземплярный метод, поле или свойство при вызове конструктора базового класса:

        class A 
        {
            public A(int i)
            {
            }
        }
    
        class B : A
        {
            public B()
                : base(Foo())
            {
            }
    
            private int Foo()
            {
                return 0;
            }
        }


    5) Разрешить использовать значения свойств объекта в инциализаторе этого же объекта. Вместо:

                var value = 1;
                var a = new A
                {
                    MyIntProperty = value,
                    MyStringProperty = value.ToString()
                };


    писать:

                var a = new A
                {
                    MyIntProperty = 1,
                    MyStringProperty = MyIntProperty.ToString()
                };


    Если в текущем контексте уже есть MyIntProperty, разруливать неоднозначность в пользу уже существующего идентификатора, либо считать это ошибкой.

    6) Убрать неоднозначность при явном задании размера массивов (для явно типизированных — можно, для неявно типизированных — почему-то нельзя, http://stackoverflow.com/questions/14597522/implicitly-typed-arrays-why-we-cant-set-array-size-explicitly).
    Re[3]: Что нужно добавить в C#?
    От: IT Россия linq2db.com
    Дата: 20.02.13 06:23
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    IT>>- ПМ и АТД.


    AVK>Основная проблема с ПМ, как озвучил Мэдс, в АТД. Это новый first class citizen, который отчасти дублирует существующие сущности в языке.


    И чего оно такого дублирует?
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[4]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 06:53
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>И чего оно такого дублирует?


    Обычные классы с виртуальными методами.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[5]: Что нужно добавить в C#?
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 20.02.13 07:00
    Оценка: 1 (1) +1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, IT, Вы писали:


    IT>>И чего оно такого дублирует?


    AVK>Обычные классы с виртуальными методами.


    А какая проблема в дублировании? В F# и Nemerle есть и обычные классы и АлгТД
    Re[4]: Что нужно добавить в C#?
    От: Qbit86 Кипр
    Дата: 20.02.13 07:42
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    M>>Тогда придется спилить безымянный палец. Чтоб не стучал по клавише ;

    K>как временное решение или workaround,
    K>можно примотать мизинец к безымянному пальцу, ну или приклееть суперклеем.

    Я использовал более радикальный вариант: ездил на велосипеде по городу без гарда на руле. В итоге на три недели мизинец пригипсовали к безымянному.
    Глаза у меня добрые, но рубашка — смирительная!
    Re: Что нужно добавить в C#?
    От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
    Дата: 20.02.13 07:50
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    Сецчас язык настолько опережает рантайм, что дальнейшие "мажорные" фичи — это рост колосса на глиняных ногах.
    С точки зрения людей, не знакомых с кухней MS, C# и .NET CLR — даже не муж и жена, а вообще один человек.

    Так что все силы надо пускать на CLR — многоплатформенность, нормальные оптимизации, наконец-таки нормальный x64, внятный и предсказуемый GC
    С уважением, Евгений
    JetBrains, Inc. "Develop with pleasure!"
    Re[2]: Что нужно добавить в C#?
    От: Tom Россия http://www.RSDN.ru
    Дата: 20.02.13 08:19
    Оценка:
    X>Так что все силы надо пускать на CLR — многоплатформенность, нормальные оптимизации, наконец-таки нормальный x64, внятный и предсказуемый GC
    А что не так с x64 если не секрет? Ну и чем GC не предсказуем?
    Просто интересуюсь
    Народная мудрось
    всем все никому ничего(с).
    Re[3]: Что нужно добавить в C#?
    От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
    Дата: 20.02.13 08:37
    Оценка:
    Здравствуйте, Tom, Вы писали:

    Tom>А что не так с x64 если не секрет?


    Полное отсутствие оптимизаций

    Tom>Ну и чем GC не предсказуем?


    Тут я не могу строго сформулировать... Но общее ощущение что он "живет своей жизнью", в отличии от jvm. Ну и захлебывается на гораздо меньших объемах кучи.
    Что надо и хочется чтоб было сделано —
    1) инкрементальная фоновая сборка в gen2 БЕЗ релокации до определенного % наполнения кучи
    2) сборка в LOH с релокацией
    3) раздельные (конфигурябельно) GEN0 кучи для тредов для устраниния эффекта "кризиса среднего возраста"
    и т.д.
    С уважением, Евгений
    JetBrains, Inc. "Develop with pleasure!"
    Re: Что нужно добавить в C#?
    От: Tanker  
    Дата: 20.02.13 08:42
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Небольшое вступление.


    computation expressions, как в F#
    http://msdn.microsoft.com/en-us/library/dd233182.aspx

    Расширеная поддержка туплов, множественное присваивание:
    Tuple<int,string> F();
    
    var (a, s) = F();


    Компайл тайм рефлексия:
    class F<TArg>
    {
     void Method1(TArg arg1);
    }
    ...
    var info = typeOf(new F<string>()).Method1.arg1.Type.Name; // здесь генерится структура компилятором, в которой будет вся инфа о классе
    
    Assert.AreEqual("string",info);


    Расширеная поддержка выражений:
    Expression<Func<IEnumerable<int>>> array = GetValues();
    
    Expression e = `foreach(var item in #array) { DoSomething(item)}`;
    
    e.Compile().Invoke();

    Разворачивается в обычные экспрешны.

    Анонимные классы:
    var b = true;
    using(var f = new IDisposable { void Dispose { b = false; } } )
    {
    
    }

    Здесь по аналогии с лямбдами генерируется класс по описанию.
    The animals went in two by two, hurrah, hurrah...
    Re[4]: Что нужно добавить в C#?
    От: k0st1x Марс  
    Дата: 20.02.13 09:37
    Оценка:
    Здравствуйте, xvost, Вы писали:

    X>Здравствуйте, Tom, Вы писали:


    Tom>>А что не так с x64 если не секрет?


    X>Полное отсутствие оптимизаций


    я не знаток во внутренних оптимизациях .net'а, но мне казалось, что TCO работает только в x64;
    чем не оптимизация?
    Re[4]: Что нужно добавить в C#?
    От: Tanker  
    Дата: 20.02.13 12:08
    Оценка:
    Здравствуйте, xvost, Вы писали:

    X> 2) сборка в LOH с релокацией


    А в 4.5 разве это не появилось ?
    The animals went in two by two, hurrah, hurrah...
    Re[5]: Что нужно добавить в C#?
    От: IT Россия linq2db.com
    Дата: 20.02.13 15:27
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    IT>>И чего оно такого дублирует?

    AVK>Обычные классы с виртуальными методами.

    Так можно договориться до того, что любой класс дублирует функциональность object.
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[2]: Что нужно добавить в C#?
    От: IT Россия linq2db.com
    Дата: 20.02.13 15:31
    Оценка:
    Здравствуйте, xvost, Вы писали:

    X>Сецчас язык настолько опережает рантайм, что дальнейшие "мажорные" фичи — это рост колосса на глиняных ногах.

    X>С точки зрения людей, не знакомых с кухней MS, C# и .NET CLR — даже не муж и жена, а вообще один человек.
    X>Так что все силы надо пускать на CLR — многоплатформенность, нормальные оптимизации, наконец-таки нормальный x64, внятный и предсказуемый GC

    Не согласен. Тот же Немерле опровергает эту теорию. Например, хвостовая рекурсия в нём работает давно, без поддержки CLR и гораздо более эффективнее. А дженерики, методы расширения, тюплы и аналог динамиков в нём появились раньше, чем это появилось в CLR.
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[2]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 16:15
    Оценка: 22 (1)
    Здравствуйте, xvost, Вы писали:

    X>Сецчас язык настолько опережает рантайм, что дальнейшие "мажорные" фичи — это рост колосса на глиняных ногах.


    По рантайму тоже подвижки есть, кроме того, сейчас команда рантайма намного теснее работает с шарповской, нежели раньше. Но подробности пока под NDA.

    X>Так что все силы надо пускать на CLR — многоплатформенность, нормальные оптимизации, наконец-таки нормальный x64, внятный и предсказуемый GC


    Многоплатформенности ждать не стоит, остальное вполне.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[3]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 16:15
    Оценка: 6 (1)
    Здравствуйте, Tom, Вы писали:

    Tom>А что не так с x64 если не секрет?


    Он крайне дохлый в плане оптимизации. Поэтому первым будут заменять именно его.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[3]: Что нужно добавить в C#?
    От: matumba  
    Дата: 20.02.13 20:27
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>При чём тут C#?


    Чуть ниже я объяснил причём:

    M>>Вообще, у C# довольно помоечный синтаксис работы с классами: вместо элегантных конструкций с именами типов приходится влезать чуть ли не в ассемблер: Класс.ДайСвойТип().ШаманскиеФункции.... отстой полнейший. Нужен синтаксис сразу на уровне "Класс", типа "Класс.ДайПропертиСАтрибутом(Атрибут)".


    Без поддержки языка это не делается в принципе.
    Путь C# будет "чуть более бейсиком" — упрощать низкоуровневый код. Сей и Сипипей мы уже наелись, пора как-то подымать уровень!

    M>>Улучшить оператор AS: нечасто, но изрядно упрощает бойлерплэйт a = b as SomeType; if (a != null) ....; Вариант: when(b = a as SomeType) { юзаем b }


    S>a.WhenIs<SomeType>{b=>юзаем b }


    Костыли не интересны ввиду своей неэлегантности. Тот же ?: тоже выражается через if'ы, тем не менее, его ввели в язык.
    И потом, можно провести анализ кода — поискать наиболее употребимые конструкции и решить как их можно упростить.

    M>>Упрощ. иниц. объекта помимо new: var z = GetObject() <= { filed = 4, field2 = 5 }

    S>Зачем?

    Можно не вводить, если реализуют паскалевский with.
    Синклер, если следовать логике Смоллтока, можно вообще оставить две вещи — присвоение и посылка сообщения. Но люди почему-то хотят иметь более "читаемый" код.

    M>>Duck typing ака MapAs: приводить объект к интерфейсу, если он совместим по методам.

    S>Реализовано в библиотеках — BLToolkit смотрели?

    эээ... Я БЛТ юзаю только для БД. Надо будет глянуть, пасип
    Re[3]: Что нужно добавить в C#?
    От: matumba  
    Дата: 20.02.13 20:38
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Ты продолжай в таком тоне общаться, и тебя вообще никто слушать не будет.


    Извиняюсь, поторопился. Как в анеке: "Да пошла она со своей солью!". Просто язык как был низкоуровневой "си-подобной" фигнёй, так за 10 лет и не вырос. И главное, разрабы думают о каких-то "киллер-фичах", хотя у языка хватает и "обычных" улучшений — посмотри сколько в ветке собралось "мелочей". Уверен, никто их даже читать не будет — они, видите ли, не подходят для маркетоидных испражнений. Вот так яснее моё негодование?
    Re[4]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 20.02.13 22:32
    Оценка:
    Здравствуйте, matumba, Вы писали:

    M>Уверен, никто их даже читать не будет


    Ты не прав. Я вчера утром про этот топик рассказал Мэдсу, и позже он говорил, что ждет когда я скомпилирую суммарный документ.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[4]: Что нужно добавить в C#?
    От: Аноним  
    Дата: 21.02.13 05:56
    Оценка:
    Здравствуйте, Цыба, Вы писали:

    Ц>Здравствуйте, xorets, Вы писали:


    X>>Очень поддерживаю. Нужна возможность декларировать интерфейс создания семейства объектов.


    Ц>Это просто идея, и я не уверен в её состоятельности. Я на самом деле очень люблю неизменяемые типы, но таким образом даже от левого класса нужна поддержка такого специфического конструирования объекта, хотя это забота уже самого типа. Поведение принято решать через методы интерфейсов. Быть может, здесь лучше использовать фабрику объектов, которая знает как создать неизменяемый объект?


    Фабрика в этом случае — это лишний класс на пустом месте. Все правки шарпа как раз и нацелены на уменьшение количества "лишнего" кода.Так что считаю, что идея очень правильная. Сам тоже об этом думал: http://blogs.byte-force.com/xor/archive/2004/11/04/333.aspx


    У меня еще была идея, что в лженериках был бы полезен thistype: http://blogs.byte-force.com/xor/archive/2009/09/15/thistype-for-generics.aspx
    Re[5]: Лженерики
    От: Qbit86 Кипр
    Дата: 21.02.13 05:59
    Оценка: :))) :))) :)
    Здравствуйте, Аноним, Вы писали:

    А>У меня еще была идея, что в лженериках был бы полезен thistype: http://blogs.byte-force.com/xor/archive/2009/09/15/thistype-for-generics.aspx


    О, хорошее слово «лженерики». «Лженерики» — это дженерики в Джаве.
    Глаза у меня добрые, но рубашка — смирительная!
    Re: Что нужно добавить в C#?
    От: k0st1x Марс  
    Дата: 21.02.13 07:01
    Оценка:
    вот еще вспомнилось, чего нехватает в C#

    сейчас нельзя написать структуру с автопропертями

    struct Foobar {
      public string Name {get; set;}
      public Foobar(string name) {
        Name = name;
      }
    }
    Re: Ковариантность по возвращаемому значению в виртуальных методах.
    От: Jack128  
    Дата: 21.02.13 07:19
    Оценка: 1 (1) +1
    Здравствуйте, AndrewVK, Вы писали:

    Хз, можно ли это красиво сделать без правок в CLR, но фича полезная и логичная была бы.


    class CollectionItem {}
    class Collection 
    {
        protected virtual CollectionItem CreateItem() {...}
    }
    
    
    
    class MyCollectionItem: CollectionItem {}
    class MyCollection 
    {
        protected override MyCollectionItem CreateItem() {...}
    }


    В Java есть, AFAIR.
    Re[2]: Что нужно добавить в C#?
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 21.02.13 07:29
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>сейчас нельзя написать структуру с автопропертями

    Можно
    struct Foobar {
      public string Name {get; set;}
      public Foobar(string name): this() {
        Name = name;
      }
    }
    Re[6]: Лженерики
    От: xorets  
    Дата: 21.02.13 07:31
    Оценка:
    Здравствуйте, Qbit86, Вы писали:

    Q>Здравствуйте, Аноним, Вы писали:


    А>>У меня еще была идея, что в лженериках был бы полезен thistype: http://blogs.byte-force.com/xor/archive/2009/09/15/thistype-for-generics.aspx


    Q>О, хорошее слово «лженерики». «Лженерики» — это дженерики в Джаве.


    На планшете вечно мимо кнопок промахиваюсь. Иногда — удачно.
    Re[2]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: k0st1x Марс  
    Дата: 21.02.13 07:33
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>Здравствуйте, AndrewVK, Вы писали:


    J>Хз, можно ли это красиво сделать без правок в CLR, но фича полезная и логичная была бы.



    J>
    J>class CollectionItem {}
    J>class Collection 
    J>{
    J>    protected virtual CollectionItem CreateItem() {...}
    J>}
    
    
    
    J>class MyCollectionItem: CollectionItem {}
    J>class MyCollection 
    J>{
    J>    protected override MyCollectionItem CreateItem() {...}
    J>}
    J>


    J>В Java есть, AFAIR.


    имхо, для такого кода хорошо подходят дженерики
    Re: Что нужно добавить в C#?
    От: Быдлокодер  
    Дата: 21.02.13 07:33
    Оценка:
    Блоки итераторов в лямбда выражениях!!
    Re[3]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: Jack128  
    Дата: 21.02.13 07:39
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>имхо, для такого кода хорошо подходят дженерики


    Ну и получится у класс с N дженерик параметрами, N — количество виртуальных не-void методов. Не страшно?
    Re[3]: Что нужно добавить в C#?
    От: k0st1x Марс  
    Дата: 21.02.13 07:43
    Оценка:
    Здравствуйте, samius, Вы писали:

    S>Здравствуйте, k0st1x, Вы писали:


    K>>сейчас нельзя написать структуру с автопропертями

    S>Можно
    S>
    S>struct Foobar {
    S>  public string Name {get; set;}
    S>  public Foobar(string name): this() {
    S>    Name = name;
    S>  }
    S>}
    S>


    спасибо : ) не знал про этот странный нюанс.
    но все равно есть, что улучшать : )
    было бы здорово, чтобы вообще без дополнительного вызова.
    Re[2]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 21.02.13 07:45
    Оценка: -1
    Здравствуйте, Jack128, Вы писали:

    J>Здравствуйте, AndrewVK, Вы писали:


    J>Хз, можно ли это красиво сделать без правок в CLR, но фича полезная и логичная была бы.



    J>
    J>class CollectionItem {}
    J>class Collection 
    J>{
    J>    protected virtual CollectionItem CreateItem() {...}
    J>}
    
    
    
    J>class MyCollectionItem: CollectionItem {}
    J>class MyCollection 
    J>{
    J>    protected override MyCollectionItem CreateItem() {...}
    J>}
    J>


    J>В Java есть, AFAIR.


    А зачем? Что мешает возвращать MyCollectionItem, там где требуется CollectionItem ? Вариантность вообще-то к дженерикам относится. А тут непонятно что.
    Re[4]: Что нужно добавить в C#?
    От: hardcase Пират http://nemerle.org
    Дата: 21.02.13 07:52
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>спасибо : ) не знал про этот странный нюанс.

    K>но все равно есть, что улучшать : )
    K>было бы здорово, чтобы вообще без дополнительного вызова.

    Этого вызова по факту не существует.
    /* иЗвиНите зА неРовнЫй поЧерК */
    Re[3]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: Jack128  
    Дата: 21.02.13 07:53
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>А зачем? Что мешает возвращать MyCollectionItem, там где требуется CollectionItem ?

    Не что не мешает. Точно так же как ничто не мешает в наследнике MyCollection2: MyCollection в CreateItem вернуть CollectionItem. А по идее — компилятор должен мешать.

    G>Вариантность вообще-то к дженерикам относится.

    Перечитал несколько раз. Слова generics — не нашел. Только абстрактное "operation".
    Re[4]: Что нужно добавить в C#?
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 21.02.13 07:55
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>Здравствуйте, samius, Вы писали:


    S>>Можно

    S>>
    S>>  public string Name {get; set;}
    S>>  public Foobar(string name): this() {
    S>>    Name = name;
    S>>  }
    S>>


    K>спасибо : ) не знал про этот странный нюанс.

    Ничего странного. Если рассахарить и ввести поле, то компилятор точно так же не дает обращаться к сеттеру свойства, пока не будут проиницилизированы все поля. Либо явно инициализируем введенное поле, либо неявно (вызываем конструктор по умолчанию).
    K>но все равно есть, что улучшать : )
    K>было бы здорово, чтобы вообще без дополнительного вызова.
    Уверен что дополнительного вызова нет.
    Re[4]: Что нужно добавить в C#?
    От: Аноним  
    Дата: 21.02.13 07:59
    Оценка:
    Здравствуйте, matumba, Вы писали:


    M>Можно не вводить, если реализуют паскалевский with.


    Паскалевский with скорее зло, чем благо. Особенно когда они вложены друг в друга.
    Реально что в паскале удобнее, чем в c#:
    1. это явное приведение типов не (Type)exp, а Type(exp)
    2. очень не хватает множеств set и операций с ними в приятном синтаксисе, а не вызове методов класса.
    Re[5]: Что нужно добавить в C#?
    От: Цыба Украина  
    Дата: 21.02.13 08:02
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>Паскалевский with скорее зло, чем благо. Особенно когда они вложены друг в друга.


    Как и в JavaScript, потому что к with нет явной привязки к контексту. В VB.NET, как я понимаю, привязка есть.
    Re[4]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 21.02.13 08:04
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>Здравствуйте, gandjustas, Вы писали:


    G>>А зачем? Что мешает возвращать MyCollectionItem, там где требуется CollectionItem ?

    J>Не что не мешает. Точно так же как ничто не мешает в наследнике MyCollection2: MyCollection в CreateItem вернуть CollectionItem. А по идее — компилятор должен мешать.
    Кому должен? Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.
    Вообще есть вероятность нарушения LSP при таком поведении.

    G>>Вариантность вообще-то к дженерикам относится.

    J>Перечитал несколько раз. Слова generics — не нашел. Только абстрактное "operation".

    http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.
    Re[5]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 21.02.13 08:09
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.


    object obj = 1;

    вот это уже ковариантность.
    object[] = new int[] { 1 };

    И это тоже. Дженериков нет, ковариантность есть.
    Re[6]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 21.02.13 08:12
    Оценка:
    S>
    S>object[] = new int[] { 1 };
    S>

    S>И это тоже.
    Тут я немного нагнал, нужны reference типы. Для строк работает, для int-ов — нет.
    Re[5]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: Jack128  
    Дата: 21.02.13 08:34
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>Здравствуйте, Jack128, Вы писали:


    J>>Здравствуйте, gandjustas, Вы писали:


    G>>>А зачем? Что мешает возвращать MyCollectionItem, там где требуется CollectionItem ?

    J>>Не что не мешает. Точно так же как ничто не мешает в наследнике MyCollection2: MyCollection в CreateItem вернуть CollectionItem. А по идее — компилятор должен мешать.
    G>Кому должен?
    программисту.

    G>Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.

    G>Вообще есть вероятность нарушения LSP при таком поведении.
    "такое поведение" — это поведение MyCollection2? естественно нарушит LSP. И именно этого и поможет избежать предлагаемая фича.


    G>>>Вариантность вообще-то к дженерикам относится.

    J>>Перечитал несколько раз. Слова generics — не нашел. Только абстрактное "operation".

    G>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.

    а какой реальности идет речь, если вариантность — понятие из абстрактной математики? то что ты в курсе только о вариантности делегатов и интерфейсов не означает, что это понятие нельзя применить к другим "операциям".
    Re[6]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 21.02.13 12:09
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    G>>Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.

    G>>Вообще есть вероятность нарушения LSP при таком поведении.
    J>"такое поведение" — это поведение MyCollection2? естественно нарушит LSP. И именно этого и поможет избежать предлагаемая фича.
    Как она поможет избежать? Примером кода пожалуйста.


    G>>>>Вариантность вообще-то к дженерикам относится.

    J>>>Перечитал несколько раз. Слова generics — не нашел. Только абстрактное "operation".

    G>>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.

    J>а какой реальности идет речь, если вариантность — понятие из абстрактной математики? то что ты в курсе только о вариантности делегатов и интерфейсов не означает, что это понятие нельзя применить к другим "операциям".
    Ты прочитал то статью? Как относится вариантность к тому что ты пишешь?
    Re[6]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 21.02.13 12:41
    Оценка:
    Здравствуйте, samius, Вы писали:

    S>Здравствуйте, gandjustas, Вы писали:


    G>>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.


    S>
    S>object obj = 1;
    S>

    S>вот это уже ковариантность.
    Да ну? А где здесь функтор?

    S>
    S>object[] = new int[] { 1 };
    S>

    S>И это тоже. Дженериков нет, ковариантность есть.
    Array всегда был недодженериком. И эта ковариантность очень опасна, ведь можно сделать так:
    object[] x = new int[] { 1 };
    x[0] = new object(); //Ахтунг
    Re[7]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 21.02.13 12:46
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>Здравствуйте, samius, Вы писали:


    S>>
    S>>object obj = 1;
    S>>

    S>>вот это уже ковариантность.
    G>Да ну? А где здесь функтор?

    А зачем функтор?

    S>>И это тоже. Дженериков нет, ковариантность есть.

    G>Array всегда был недодженериком. И эта ковариантность очень опасна, ведь можно сделать так:
    G>
    G>object[] x = new int[] { 1 };
    G>x[0] = new object(); //Ахтунг
    G>

    Тем не менее, ковариантность массивов — формальная фича C# 1.0
    Re[8]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 21.02.13 12:53
    Оценка:
    Здравствуйте, samius, Вы писали:

    S>Здравствуйте, gandjustas, Вы писали:


    G>>Здравствуйте, samius, Вы писали:


    S>>>
    S>>>object obj = 1;
    S>>>

    S>>>вот это уже ковариантность.
    G>>Да ну? А где здесь функтор?

    S>А зачем функтор?

    А что такое вариантность вообще?
    Re[9]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 21.02.13 13:01
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>Здравствуйте, samius, Вы писали:


    S>>>>вот это уже ковариантность.

    G>>>Да ну? А где здесь функтор?

    S>>А зачем функтор?

    G>А что такое вариантность вообще?
    Это смотря где.
    А в контексте программирования под ковариантностью и контрвариантностью подразумевают взаимозаеняемость и эквивалентность типов в определенных ситуациях на основе отношений типов (частное/общее).
    Re[2]: Что нужно добавить в C#?
    От: alexzz  
    Дата: 21.02.13 13:13
    Оценка:
    Здравствуйте, matumba, Вы писали:

    M>Приведение типов неуклюжее. Вместо
    double z = (double)IntVar;
    можно было б писать
    double z := IntVar;
    , т.е. := — это "присвоить с приведением типа к lvalue". Словесный понос надо искоренять — пусть паскалисты его тыркают.



    Я не понял, почему нельзя так написать?

    double z = intVar;
    Re[5]: Что нужно добавить в C#?
    От: Aлeкceй  
    Дата: 21.02.13 13:41
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Ты не прав. Я вчера утром про этот топик рассказал Мэдсу, и позже он говорил, что ждет когда я скомпилирую суммарный документ.


    Вообще есть шанс, что хоть какие-нибудь наши хотелки реализуют?
    Re[2]: Что нужно добавить в C#?
    От: G-Host  
    Дата: 21.02.13 13:45
    Оценка:
    Здравствуйте, Don Reba, Вы писали:

    DR>Здравствуйте, AndrewVK, Вы писали:


    DR>Мне в Шарпе не хватает одной фичи из Немерле: foreach c индексатором, типа:


    DR>
    foreach (var x from collection with i)

    DR>Здесь i номер текущей итерации.
    в чем существенная польза? не так часто нужно, а если нужно то можно индексировать самому.
    или я не так понял идею?
    Re[7]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: Jack128  
    Дата: 21.02.13 13:46
    Оценка: +1
    Здравствуйте, gandjustas, Вы писали:

    G>Здравствуйте, Jack128, Вы писали:


    G>>>Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.

    G>>>Вообще есть вероятность нарушения LSP при таком поведении.
    J>>"такое поведение" — это поведение MyCollection2? естественно нарушит LSP. И именно этого и поможет избежать предлагаемая фича.
    G>Как она поможет избежать? Примером кода пожалуйста.

    class CollectionItem {}
    class Collection
    {
    protected virtual CollectionItem CreateItem() {...}
    }



    class MyCollectionItem: CollectionItem {}
    class MyCollection: Collection
    {
    protected override MyCollectionItem CreateItem() {...}
    }

    class MyCollection2: MyCollection
    {
    // protected override CollectionItem CreateItem() {...} так ошибка компиляции, так как CollectionItem не является MyCollectionItem, ковариантность нарушится. Раз не компилируется, то LSP не сможем нарушить.
    protected override MyCollectionItem CreateItem() {...} // а так вполне можно.

    }


    G>>>http://gandjustas.blogspot.ru/2009/11/blog-post.html вот тут посвежее и ближе к реальности.

    J>>а какой реальности идет речь, если вариантность — понятие из абстрактной математики? то что ты в курсе только о вариантности делегатов и интерфейсов не означает, что это понятие нельзя применить к другим "операциям".
    G>Ты прочитал то статью? Как относится вариантность к тому что ты пишешь?

    ну как, твоя статья описывает частные случаи вариантности, реализованные в C#. Какая вариантность бывает в других языках — можно на вики почитать.
    Re[3]: Что нужно добавить в C#?
    От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
    Дата: 21.02.13 14:04
    Оценка:
    Здравствуйте, G-Host, Вы писали:

    GH>в чем существенная польза? не так часто нужно, а если нужно то можно индексировать самому.

    GH>или я не так понял идею?

    Мне не так уж и редко приходится оборачивать foreach в ручную реализацию for. Вот несколько сценариев:

    foreach (var x in myEnum with i)
    {
        if (i == 0)
            // ...
        else
            // ...
    }
    
    foreach (var x in myEnum with i)
        Console.WriteLine("{0,-2}: {1}", i + 1, x);
    
    foreach (var x in myEnumwith i)
        DoSomething(x, myArray[i]);
    Ce n'est que pour vous dire ce que je vous dis.
    Re[8]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 21.02.13 14:15
    Оценка:
    Здравствуйте, Jack128, Вы писали:

    J>Здравствуйте, gandjustas, Вы писали:


    G>>Здравствуйте, Jack128, Вы писали:


    G>>>>Ты же наследование делаешь чтобы обращаться к наследникам через ссылку на базовый класс. Соответственно непонятно зачем в наследнике менять типы, и как сообщить компилятору какой тип правильный.

    G>>>>Вообще есть вероятность нарушения LSP при таком поведении.
    J>>>"такое поведение" — это поведение MyCollection2? естественно нарушит LSP. И именно этого и поможет избежать предлагаемая фича.
    G>>Как она поможет избежать? Примером кода пожалуйста.

    J>class CollectionItem {}

    J>class Collection
    J>{
    J> protected virtual CollectionItem CreateItem() {...}
    J>}



    J>class MyCollectionItem: CollectionItem {}

    J>class MyCollection: Collection
    J>{
    J> protected override MyCollectionItem CreateItem() {...}
    J>}

    J>class MyCollection2: MyCollection

    J>{
    J> // protected override CollectionItem CreateItem() {...} так ошибка компиляции, так как CollectionItem не является MyCollectionItem, ковариантность нарушится. Раз не компилируется, то LSP не сможем нарушить.
    J> protected override MyCollectionItem CreateItem() {...} // а так вполне можно.

    J>}


    Надо как-то связь межу MyCollection2 и MyCollectionItem передавать. А это делается через генерики.
    Делай так:

    class CollectionItem {}
    class Collection<T> 
    {
        protected virtual T CreateItem() {...}
    }
    Re[10]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 21.02.13 14:20
    Оценка:
    Здравствуйте, samius, Вы писали:

    S>Здравствуйте, gandjustas, Вы писали:


    G>>Здравствуйте, samius, Вы писали:


    S>>>>>вот это уже ковариантность.

    G>>>>Да ну? А где здесь функтор?

    S>>>А зачем функтор?

    G>>А что такое вариантность вообще?
    S>Это смотря где.
    S>А в контексте программирования под ковариантностью и контрвариантностью подразумевают взаимозаеняемость и эквивалентность типов в определенных ситуациях на основе отношений типов (частное/общее).

    С точки зрения теории категорий (на которой основаны системы типов). Есть объект (тип) и стрелки между ними (отношения тип-подтип, она же взаимозаменяемость) вместе это категория. Есть функтор (генерик или массив), который преобразует одну категорию в другую (на самом деле в подкатегорию исходной, но это тут неважно). Так вот в зависимости он воздействия функтора на стрелки его вариантность и определяется. В принципе могут быть и другие функторы, но, насколько я знаю, в C# других, похожих на функторы, частей нету.
    Re[5]: Что нужно добавить в C#?
    От: Цыба Украина  
    Дата: 21.02.13 14:22
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>Я исхожу из реальной проблемы: часто встречаешь набор функций, которые относятся только к enum'у, но хостятся в классе Utils, Converters и т.п. Если их можно было бы засунуть в сам enum, было бы понятно:


    Решение не менее реальной проблемы на Java:

                                 // V - для своего lookupIndexedEnumValue() в ответ на жирный аналог в LengthUnit.Parse
    public enum RoleType implements IIndexable<String>, IRoleAuthorizationContextFactory  {
    
        ADMINISTRATOR("admin") {
            @Override
            public IRoleAuthorizationContext createRoleAuthorizationContext(Request request) {
                return new AdministratorRoleAuthorizationContext();
            }
        },
    
        EDITOR("editor") {
            @Override
            public IRoleAuthorizationContext createRoleAuthorizationContext(Request request) {
                return new EditorRoleAuthorizationContext(request);
            }
        };
    
        private final String alias;
    
        RoleType(String alias) {
            this.alias = alias;
        }
    
        @Override
        public final String getIndexKey() {
            return alias;
        }
    
    }


    И внезапно в аннотациях/аттрибутах:

    public interface IService {
    
        @Role(ADMINISTRATOR)
        void foo();
    
        @Role(EDITOR)
        void bar();
    
    }


    Что здесь плохого?
    Re: Что нужно добавить в C#?
    От: Osaka  
    Дата: 21.02.13 16:16
    Оценка: -2
    http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2049821-debug-lambda-expressions
    Друга ищи не того, кто любезен с тобой, кто с тобой соглашается, а крепкого советника, кто полезного для тебя ищет и противится твоим необдуманным словам.
    Re[6]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 21.02.13 16:24
    Оценка:
    Здравствуйте, Aлeкceй, Вы писали:

    A>Вообще есть шанс, что хоть какие-нибудь наши хотелки реализуют?


    Шанс есть. А вот какой — этого я сказать не могу.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 23 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[11]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 21.02.13 18:39
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>Здравствуйте, samius, Вы писали:


    S>>А в контексте программирования под ковариантностью и контрвариантностью подразумевают взаимозаеняемость и эквивалентность типов в определенных ситуациях на основе отношений типов (частное/общее).


    G>С точки зрения теории категорий (на которой основаны системы типов). Есть объект (тип) и стрелки между ними (отношения тип-подтип, она же взаимозаменяемость) вместе это категория.

    Стрелка тип-подтип уже не дает взаимозаменяемости в полной мере, т.к. в зависимости от обстоятельств, либо подтип может быть сконвертирован в тип, либо тип в подтип.

    G>Есть функтор (генерик или массив), который преобразует одну категорию в другую (на самом деле в подкатегорию исходной, но это тут неважно). Так вот в зависимости он воздействия функтора на стрелки его вариантность и определяется. В принципе могут быть и другие функторы, но, насколько я знаю, в C# других, похожих на функторы, частей нету.


    Генерики там совсем с другой стороны. Функтор (согласно википедии же) определяет функцию преобразования типа F : C x C -> C и совершенно не имеет отношения к массиву. Ну разве что косвенно, т.к. преобразования типов можно делать как на уровне string -> object, так и на уровне T<X> -> T<Y> или string[] -> object[].
    C# изначально позволял работать с вариантностью на уровне параметров методов, возврата результата метода, исключений и т.п. И лишь недавно стал более-менее полно поддерживать вариантность дженериков.
    Re[9]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: Jack128  
    Дата: 21.02.13 19:16
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>Надо как-то связь межу MyCollection2 и MyCollectionItem передавать. А это делается через генерики.

    G>Делай так:

    G>
    G>class CollectionItem {}
    G>class Collection<T> 
    G>{
    G>    protected virtual T CreateItem() {...}
    G>}
    G>


    http://www.rsdn.ru/forum/dotnet/5077257.1
    Автор: Jack128
    Дата: 21.02.13
    Re[12]: Ковариантность по возвращаемому значению в виртуальн
    От: gandjustas Россия http://blog.gandjustas.ru/
    Дата: 21.02.13 19:50
    Оценка:
    Здравствуйте, samius, Вы писали:

    S>Здравствуйте, gandjustas, Вы писали:


    G>>Здравствуйте, samius, Вы писали:


    S>>>А в контексте программирования под ковариантностью и контрвариантностью подразумевают взаимозаеняемость и эквивалентность типов в определенных ситуациях на основе отношений типов (частное/общее).


    G>>С точки зрения теории категорий (на которой основаны системы типов). Есть объект (тип) и стрелки между ними (отношения тип-подтип, она же взаимозаменяемость) вместе это категория.

    S>Стрелка тип-подтип уже не дает взаимозаменяемости в полной мере, т.к. в зависимости от обстоятельств, либо подтип может быть сконвертирован в тип, либо тип в подтип.

    Ни слова не понял.

    G>>Есть функтор (генерик или массив), который преобразует одну категорию в другую (на самом деле в подкатегорию исходной, но это тут неважно). Так вот в зависимости он воздействия функтора на стрелки его вариантность и определяется. В принципе могут быть и другие функторы, но, насколько я знаю, в C# других, похожих на функторы, частей нету.


    S>Генерики там совсем с другой стороны. Функтор (согласно википедии же) определяет функцию преобразования типа F : C x C -> C и совершенно не имеет отношения к массиву. Ну разве что косвенно, т.к. преобразования типов можно делать как на уровне string -> object, так и на уровне T<X> -> T<Y> или string[] -> object[].

    Функтор эта статья? Там нет определения, которое ты написал.
    Давай с начала.
    Есть категория (множество) типов T. Есть преобразование этой категории, которое для каждого типа t из T позволяет получить IEnumerable<t> (по сути тоже из T). Это преобразование называется функтором (в данном случае эндофунктором, но это неважно).
    Аналогичное можно сказать по Action<T>, и про массивы.

    Так вот в категории кроме объектов (типов) есть еще и между объектами. В нашем случае стрелки — отношения "тип-подтип", которые задаются наследованием. Так вот функтор, сохраняющий это отношение в результирующей категории называется ковариантным.

    а вот твой пример

    object x = 1 as int;

    Ну никак он на функторы не похож.


    S>C# изначально позволял работать с вариантностью на уровне параметров методов, возврата результата метода, исключений и т.п. И лишь недавно стал более-менее полно поддерживать вариантность дженериков.

    На уровне языка — да, на уровне clr всегда так и работало.
    Re[6]: Что нужно добавить в C#?
    От: Roman Odaisky Украина  
    Дата: 21.02.13 21:03
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    Ц>>>Есть "покруче".

    KP>>ААА! Вот откуда эту идею в Rust притащили :))
    VD>Гы-гы (2005-й год). Думаю, что и до этого где-то было.

    В Perl было еще в прошлом веке.
    До последнего не верил в пирамиду Лебедева.
    Re[4]: Что нужно добавить в C#?
    От: Санёк81 Россия  
    Дата: 21.02.13 22:00
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>как временное решение или workaround,

    K>можно примотать мизинец к безымянному пальцу, ну или приклееть суперклеем.

    Пиши на VB
    http://rsdn.ru/poll/3816
    Автор: Санёк81
    Дата: 31.01.13
    Вопрос: С кем из участников форума вы хотели бы подраться (добавляйте свои варианты)?
    Re[13]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 22.02.13 00:09
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>Здравствуйте, samius, Вы писали:


    G>>>С точки зрения теории категорий (на которой основаны системы типов). Есть объект (тип) и стрелки между ними (отношения тип-подтип, она же взаимозаменяемость) вместе это категория.

    S>>Стрелка тип-подтип уже не дает взаимозаменяемости в полной мере, т.к. в зависимости от обстоятельств, либо подтип может быть сконвертирован в тип, либо тип в подтип.

    G>Ни слова не понял.

    Не суть важно. В двух словах отношение тип-подтим и взаимозаменяемость это не одно и то же.

    S>>Генерики там совсем с другой стороны. Функтор (согласно википедии же) определяет функцию преобразования типа F : C x C -> C и совершенно не имеет отношения к массиву. Ну разве что косвенно, т.к. преобразования типов можно делать как на уровне string -> object, так и на уровне T<X> -> T<Y> или string[] -> object[].

    G>http://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D1%80_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0) эта статья? Там нет определения, которое ты написал.
    Covariance and contravariance (computer science) / 2. Origin of the rerms
    G>Давай с начала.
    Давай

    G>Есть категория (множество) типов T.

    Что бы построить категорию, нужен еще и морфизм. Одного множества недостаточно для указания категории.
    Вариантность рассматривается на категории C, которую образует множество типов и морфизм отношения подтипа.

    G>Есть преобразование этой категории, которое для каждого типа t из T позволяет получить IEnumerable<t> (по сути тоже из T). Это преобразование называется функтором (в данном случае эндофунктором, но это неважно).

    Я поспорю что это построение T -> IEnumerable<T> есть функтор в общем понимании. В C# он стал функтором только с тех пор, как стал сохранять морфизм отношения подтипов.

    G>Аналогичное можно сказать по Action<T>, и про массивы.

    Массивы ограниченно сохрнаняли морфизм подтипов с первой версии. А Action<T> — нет.

    G>Так вот в категории кроме объектов (типов) есть еще и между объектами. В нашем случае стрелки — отношения "тип-подтип", которые задаются наследованием. Так вот функтор, сохраняющий это отношение в результирующей категории называется ковариантным.

    Я только уточню что любой функтор сохраняет структуру морфизма по определению. При этом, ковариантный сохраняет направление отношения, а контрвариантный разворачивает.

    G>а вот твой пример


    G>
    G>object x = 1 as int;
    G>

    G>Ну никак он на функторы не похож.
    Здесь ты прав. Я поспешил и неверно интерпретировал примеры из статьи.

    S>>C# изначально позволял работать с вариантностью на уровне параметров методов, возврата результата метода, исключений и т.п. И лишь недавно стал более-менее полно поддерживать вариантность дженериков.

    G>На уровне языка — да, на уровне clr всегда так и работало.
    А там я тоже поспешил в отношении вариантности возврата результата метода, чем C# никогда не страдал. Это как раз то, о чем пишет Jack128. Подробнее тут (http://en.wikipedia.org/wiki/Covariant_return_type)
    Re[5]: Что нужно добавить в C#?
    От: k0st1x Марс  
    Дата: 22.02.13 06:05
    Оценка:
    Здравствуйте, Санёк81, Вы писали:

    Сё>Здравствуйте, k0st1x, Вы писали:


    K>>как временное решение или workaround,

    K>>можно примотать мизинец к безымянному пальцу, ну или приклееть суперклеем.

    Сё>Пиши на VB


    прискорбно, что смена языка — единственное решение неудобства
    Re: Что нужно добавить в C#?
    От: SergASh  
    Дата: 22.02.13 11:42
    Оценка: 33 (1) +1
    Здравствуйте, AndrewVK, Вы писали:

    Нельзя ли сделать так, чтобы enum'ы реализовывали интерфейс IEquatable<> ?
    Re[6]: Что нужно добавить в C#?
    От: Аноним  
    Дата: 22.02.13 22:47
    Оценка:
    Здравствуйте, Цыба, Вы писали:

    Ц>Что здесь плохого?


    Не уверен, что я все понял правильно, и если нет, сразу простите дурака. Но если да, то это типичный пример ява-стайл ОООП'а (Over-engineered OOP), который меня просто убивает.

    Плохо в этом примере то, что он скрывает неявное множественное наследование от System.Attribute и System.Enum.

    Вообще, я за ООП в целом и множественное наследование в частности в каждом УЯП, но МН нужно таааааак редко... и это явно не тот случай. Пусть котлеты будут отдельно, а мухи — отдельно:

    public enum RoleType
    {
        ADMINISTRATOR,
        EDITOR;
    
        public IRoleAuthorizationContext ToContext(Request request)
        {
            switch (value)
            {
                case ADMINISTRATOR: return new AdministratorRoleAuthorizationContext(); break;
                case EDITOR:        return new EditorRoleAuthorizationContext(request); break;
                default:            throw new Exception("A new role was added with no converting code."); break;
            }
        }
    }
    
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class RoleTypeAttribute : System.Attribute
    {
        ...
    }
    
    public interface IService
    {
        [RoleTypeAttribute(RoleType.ADMINISTRATOR)]
        void foo();
    
        [RoleTypeAttribute(RoleType.EDITOR)]
        void bar();
    }


    Обратите внимание на выделенное. Где ему место в вашем примере?

    И раз уж речь зашла о нововведениях и Ските, то вот тут:

    http://stackoverflow.com/questions/294216/why-does-c-sharp-forbid-generic-attribute-types

    Скит пишет следующее:

    Well, I can't answer why it's not available, but I can confirm that it's not a CLI issue. The CLI spec doesn't mention it (as far as I can see) and if you use IL directly you can create a generic attribute. The part of the C# 3 spec that bans it — section 10.1.4 "Class base specification" doesn't give any justification.

    The annotated ECMA C# 2 spec doesn't give any helpful information either, although it does provide an example of what's not allowed.

    My copy of the annotated C# 3 spec should arrive tomorrow... I'll see if that gives any more information. Anyway, it's definitely a language decision rather than a runtime one.

    EDIT: Answer from Eric Lippert (paraphrased): no particular reason, except to avoid complexity in both the language and compiler for a use case which doesn't add much value.


    Так что, если бы они ЭТО пофиксили, то ваш пример (именно ваш, без привязки к методам и с потенциальной неоднозначностью ролей) мог бы выглядеть так:

    public enum RoleType
    {
        ADMINISTRATOR,
        EDITOR;
    
        public IRoleAuthorizationContext ToContext(Request request)
        {
            switch (value)
            {
                case ADMINISTRATOR: return new AdministratorRoleAuthorizationContext(); break;
                case EDITOR:        return new EditorRoleAuthorizationContext(request); break;
                default:            throw new Exception("A new role was added with no converting code."); break;
            }
        }
    }
    
    public interface IService
    {
        [System.EnumAttribute<RoleType>(RoleType.ADMINISTRATOR)]
        void foo();
    
        [System.EnumAttribute<RoleType>(RoleType.EDITOR)]
        void bar();
    }


    P.S. Чего мне в дотнете всегда не хватало, это набора стандартизированных интерфейсов, чтоб не пилить самому каждый раз, особенно в ремотных системах. System.EnumAttribute<T> это как раз из этой оперы.
    Re[2]: Что нужно добавить в C#?
    От: neFormal Россия  
    Дата: 22.02.13 23:01
    Оценка: -1
    Здравствуйте, AK85, Вы писали:

    AK>
    AK>r = a.?b.?c;
    AK>

    AK>Это кажется называется Maybe monad.
    AK>Синтаксис подсмотрен у Bart de Smet.

    а если бы дальше первого fail-by-null не выходило, цены бы ему не было
    в groovy такое было реализовано, имхо люто неудобно.
    ...coding for chaos...
    Re[7]: Что нужно добавить в C#?
    От: Цыба Украина  
    Дата: 22.02.13 23:30
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    Синтаксис Java может показаться непривычным и немножко сбивать с толку.

    А>Не уверен, что я все понял правильно, и если нет, сразу простите дурака. Но если да, то это типичный пример ява-стайл ОООП'а (Over-engineered OOP), который меня просто убивает.


    Пускай. Дело привычки, простоты повторного использования и издержек самой Java.

    А>Плохо в этом примере то, что он скрывает неявное множественное наследование от System.Attribute и System.Enum.


    Тут нет множественного наследования и не может такового быть. Перечисления неявно наследуются исключительно от java.lang.Enum<E>, хотя и имплементирует интерфейс. Пожалуй, я неудачно выбрал имена Role и RoleType? То, что вы, возможно, посчитали за наследование от System.Attribute -- аннотация @Role, аналог [RoleAttribute] (укажу ниже). Я здесь имел в виду то, что элемент такого перечисления может появляться в качестве значения аннотации. В .NET такое невозможно, насколько мне известно, и поэтому приходится довольствоваться только тем, что может быть константой (по поводу typeof не знаю, то в Java это считается константой, как и элемент перечисления). Могу ошибаться.

    А>Обратите внимание на выделенное. Где ему место в вашем примере?


    Я тогда просто хотел показать, что полноценный объект, хоть и с ограничениями enum и @interface на типы, а не простая целочисленная константа, может указываться в аннотации (аттрибута). Собственно, тогда уж и недостающий пример:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Role { // аналог аттрибута; аналога AllowMultiple не существует
    
        RoleType value();    // RoleType - само перечесление, которое можно использовать в качестве значения анотации (value можно опускать)
    
    }


    А>И раз уж речь зашла о нововведениях и Ските, то вот тут:

    А>http://stackoverflow.com/questions/294216/why-does-c-sharp-forbid-generic-attribute-types
    А>Скит пишет следующее:
    А>...

    @interface в Java тоже не может быть generic, как и enum. В моём случае перечисление просто обязуется реализовать параметризированный generic-интерфейс (для поиска члена перечисления не по имени, а по алиасу). Мне, честно говоря, сложно подобрать случай, в котором нужны generic-аттрибуты, когда из доступных значений аттрибутов могут быть только примитивы и строки.
    Re[4]: Что нужно добавить в C#?
    От: kkolyan  
    Дата: 23.02.13 14:52
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, Tom, Вы писали:


    Tom>>А что не так с x64 если не секрет?


    AVK>Он крайне дохлый в плане оптимизации. Поэтому первым будут заменять именно его.



    попробовал выполнить код(ниже) на жаве и сишарп
    2.9гг
    c# — релиз, nf4.5(64 бита за 1700 млс, 32 — 2044)
    java — jdk 7u15 выполняет за 2000 млс,
    так что вроде с оптимизациями нормально или чтото не так под эклипсом запустил?


    public class Tester {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            long start = System.currentTimeMillis();
            int m = 1024 * 1024;
            Test(100 * m);
            long end = System.currentTimeMillis();
            System.out.println("time" + (end - start));
    
        }
    
        static void Test(int limit_) {
            int limit = limit_;
            int sqr_lim;
            boolean[] is_prime = new boolean[limit + 1];
            int x2, y2;
            int i, j;
            int n;
    
            sqr_lim = (int) Math.sqrt(limit);
            for (i = 0; i <= limit; i++)
                is_prime[i] = false;
            is_prime[2] = true;
            is_prime[3] = true;
    
            x2 = 0;
            for (i = 1; i <= sqr_lim; i++) {
                x2 += 2 * i - 1;
                y2 = 0;
                for (j = 1; j <= sqr_lim; j++) {
                    y2 += 2 * j - 1;
    
                    n = 4 * x2 + y2;
                    if ((n <= limit) && (n % 12 == 1 || n % 12 == 5))
                        is_prime[n] = !is_prime[n];
    
                    // n = 3 * x2 + y2;
                    n -= x2;
                    if ((n <= limit) && (n % 12 == 7))
                        is_prime[n] = !is_prime[n];
    
                    // n = 3 * x2 - y2;
                    n -= 2 * y2; //
                    if ((i > j) && (n <= limit) && (n % 12 == 11))
                        is_prime[n] = !is_prime[n];
                }
            }
    
            for (i = 5; i <= sqr_lim; i++) {
                if (is_prime[i]) {
                    n = i * i;
                    for (j = n; j <= limit; j += n) {
                        is_prime[j] = false;
                    }
                }
            }
    
        }
    
    }



    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    
    namespace cappTestPrime
    {
        public class Tester
        {
    
    
            public static void Main(String[] args)
            {
    
                var sw = Stopwatch.StartNew();
    
                int m = 1024 * 1024;
    
                Test(100 * m);
    
                var end = sw.ElapsedMilliseconds;
                Console.WriteLine("elapsed=" + end);
    
    
            }
    
            static void Test(int limit_)
            {
                int limit = limit_;
                int sqr_lim;
                bool[] is_prime = new bool[limit + 1];
                int x2, y2;
                int i, j;
                int n;
    
                sqr_lim = (int)Math.Sqrt(limit);
    
                for (i = 0; i <= limit; i++)
                    is_prime[i] = false;
                is_prime[2] = true;
                is_prime[3] = true;
    
                x2 = 0;
                for (i = 1; i <= sqr_lim; i++)
                {
                    x2 += 2 * i - 1;
                    y2 = 0;
                    for (j = 1; j <= sqr_lim; j++)
                    {
                        y2 += 2 * j - 1;
    
                        n = 4 * x2 + y2;
                        if ((n <= limit) && (n % 12 == 1 || n % 12 == 5))
                            is_prime[n] = !is_prime[n];
    
                        // n = 3 * x2 + y2;
                        n -= x2;
                        if ((n <= limit) && (n % 12 == 7))
                            is_prime[n] = !is_prime[n];
    
                        // n = 3 * x2 - y2;
                        n -= 2 * y2; // 
                        if ((i > j) && (n <= limit) && (n % 12 == 11))
                            is_prime[n] = !is_prime[n];
                    }
                }
    
                for (i = 5; i <= sqr_lim; i++)
                {
                    if (is_prime[i])
                    {
                        n = i * i;
                        for (j = n; j <= limit; j += n)
                        {
                            is_prime[j] = false;
                        }
                    }
                }
    
            }
    
        }
    }
    Re: Что нужно добавить в C#?
    От: FlevelEx Россия  
    Дата: 23.02.13 18:45
    Оценка: +1 -1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам.




    void Test(object sender)
    {
        if (sender is not Smth1)
        {
        }
    }



    вместо


    void Test(object sender)
    {
        if (!(sender is Smth1))
        {
        }
    }
    Re[2]: Что нужно добавить в C#?
    От: alexzz  
    Дата: 23.02.13 18:52
    Оценка: +1
    Здравствуйте, FlevelEx, Вы писали:

    FE>
    FE>void Test(object sender)
    FE>{
    FE>    if (sender is not Smth1)
    FE>    {
    FE>    }
    FE>}
    FE>


    public static class ObjectExtensions
    {
        public static bool IsNot<T>(this object obj)
        {
            return obj is T == false;
        }
    }
    Re[3]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.02.13 20:20
    Оценка: :)
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Основная проблема с ПМ, как озвучил Мэдс, в АТД. Это новый first class citizen, который отчасти дублирует существующие сущности в языке. Так что АТД ака discriminated unions на данный момент однозначно no way. Теоретически можно обойтись без АТД существующими типами с какими то дополнительными доработками, но тут нужно говорить более конкретно.


    Перевожу на русский язык — "Нам хочется еще лет 5-10 по-вредничать.", потому как в ином случае объяснить подобные утверждения можно только недостатком знаний и не желанием смотреть на то что валяется под ногами.

    Начнем с того, что ПМ не имеет никакого отношения к АлгТД (АлгТД потому как АТД принято расшифровывать как Абстрактный Тип Данных, что из другой оперы).

    Две основные фичи ПМ, которые делают его мощной штукой это:
    1. Рекурсивность.
    2. Динамические проверки типов.

    Вот пример ПМ по классам из N2:
    match (RuleSymbol)
    {
      | ExtensibleRuleSymbol => ()
      | ExtentionRuleSymbol(BaseRule = RuleRef.Some(baseRuleSymbol), ExtentionType = Prefix) =>
        defineExtentionRuleMethods(baseRuleSymbol)
    
      | ExtentionRuleSymbol(BaseRule = RuleRef.Some(baseRuleSymbol), ExtentionType = Postfix(bindingPower, _)) =>
        defineExtentionRuleMethods(baseRuleSymbol);
        _descriptorTb.DefineConditional(<[decl: public override BindingPower : int { get { $(bindingPower : int) } } ]>);
    
      | SimpleRuleSymbol  => defineNewParserMethod(<[ N2.Internal.SimpleRuleParser ]>);
      | RegularRuleSymbol => ()
      | _       => assert(false)
    }

    Здесь BaseRule и ExtentionType — это поля имеющие вариантный тип (АлгТД), а все остальное — это классы.
    RuleSymbol — это свойство типа RuleDefSymbol, а ExtensibleRuleSymbol, ExtentionRuleSymbol, SimpleRuleSymbol и RegularRuleSymbol его наследники. Причем непрямые.

    Мы используем классы для символов, так как нам нужна расширяемость, а вариантные типы этого не обеспечивают.

    Кстати, закрытость набора можно обеспечить банальным seled.

    Есть только одна фича МП которая упирается в возможности АлгТД — описание паттерна в виде конструктора. Это позволяет несколько сократить синтаксис описывая состояние объекта в виде параметров его конструктора. Чтобы это было возможно нужно иметь соответствие между полями типа и параметрами конструктора.

    Так вот, во-первых можно обходиться несколько более длинным синтаксисом в котором внутри паттерна явно указывается имя члена который нужно проверить. Зачастую это даже оказывается более удобным, так как позволяет не перечислять все параметры конструктора забивая большую часть вилдкардами (знаком _ в ФЯ).

    Во-вторых, соответствие между аргументами конструктора и полями можно задать и способами отличными от тех что используются в АлгТД. Например, можно обратиться к опыту Скалы. В ней можно объявлять конструкторы прямо в синтаксисе объявления классов (синтаксис псевдошарпа):
    class C(int firstField, string secondField)
    {
    }
    ...
    var c = C(42, "wow");
    Console.WriteLine(c.firstField);


    Здесь firstField и secondField это одновременно и поля класса С и параметры его единственного конструктора. Прибавляем сюда наследование и получаем все что нужно для классических конструкторных паттернов. Для старых типов можно использовать аннотацию задаваемую кастом-атрибутами.

    В общем, если у них проблемы с дизайном, могу за скромную сумму (ну, скажем 10К зеленых) спроектировать поддержку ПМ для шарпа, что называется под ключ (с грамматикой и описанием семантики).
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.02.13 20:26
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>извиняюсь, действительно упустил.

    K>btw, проверил этот сценарий в котлине — он ругается и не дает скомпилить.

    В котлике есть неизменяемые локальные переменные. Для них этот прокатывает. Хотя, все равно дизайн спорный выходит. В немерле можно использовать стандартный ПМ:
    when (x is Y as y)
    {
      ...
    }

    "y" имеет тип "Y" и является неизменяемой переменной. В "x" по прежнему можно присваивать новое значение (если она изменяемая) и тип у него прежний.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.02.13 20:29
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    IT>>И чего оно такого дублирует?


    AVK>Обычные классы с виртуальными методами.


    А чё ж с виртуальными то? Без них было бы проще?

    А is/as их не дублирует? А то я тут много кода видел с is/as вместо "обычных виртуальных методов".

    Об остальном я уже рядом написал.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.02.13 20:32
    Оценка:
    Здравствуйте, samius, Вы писали:

    S>А какая проблема в дублировании? В F# и Nemerle есть и обычные классы и АлгТД


    Это не объектно-ориентированно! Вот то ли дело энумы в Яве?!

    Хомечкам порвет мозг от возможности сделать что-то двумя путями. Пусть лучше паттернами проектирования пользуются и is/as-ами. А то не дай бок прострелят себе ногу не в том мести, а МС отвечать за это.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[2]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.02.13 20:36
    Оценка:
    Здравствуйте, xvost, Вы писали:

    X>Так что все силы надо пускать на CLR — многоплатформенность, нормальные оптимизации, наконец-таки нормальный x64, внятный и предсказуемый GC


    Там команды разные. Так что силы перебросить не удастся.

    К тому же 90% хотелок, описанных в этой теме, реализуются без изменения рантайма.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.02.13 21:02
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>Вообще есть вероятность нарушения LSP при таком поведении.


    Нет такой вероятности, если не разрешать делать тип возвращаемого значения более общим нежели был.

    Ковариантность для возвращаемых значений работает в С++ и Яве.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.02.13 21:05
    Оценка:
    Здравствуйте, samius, Вы писали:

    S>вот это уже ковариантность.

    S>
    S>object[] = new int[] { 1 };
    S>


    Это просто ошибка. Ковариантность в массивах работает только для ссылочных типов. А лучше бы ее вообще не было, так как для изменяемых типов для ее поддержки требуются рантайм-проверки. Дотент не хило тормозит из-за этого, при работе с массивами.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: Ковариантность по возвращаемому значению в виртуальных методах.
    От: Философ Ад http://vk.com/id10256428
    Дата: 23.02.13 21:47
    Оценка:
    Здравствуйте, gandjustas, Вы писали:

    G>object[] x = new int[] { 1 };


    ЩИТО?
    Всё сказанное выше — личное мнение, если не указано обратное.
    Re[4]: Что нужно добавить в C#?
    От: IT Россия linq2db.com
    Дата: 23.02.13 22:28
    Оценка: :)
    Здравствуйте, VladD2, Вы писали:

    VD>В общем, если у них проблемы с дизайном, могу за скромную сумму (ну, скажем 10К зеленых) спроектировать поддержку ПМ для шарпа, что называется под ключ (с грамматикой и описанием семантики).


    Могу за 20K в аналогичной валюте сделать ревью дизайна Влада. Если оно окажется типа "Всё OK", то всё равно бабки вперёд.
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[5]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.02.13 23:40
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>Могу за 20K в аналогичной валюте сделать ревью дизайна Влада. Если оно окажется типа "Всё OK", то всё равно бабки вперёд.


    Я не против. Все равно по сравнению с их затратами это демпинговые цены. Они же фичу рожают по два года и коллективно.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: В C# уже и так многое добавили
    От: Xentrax Россия http://www.lanovets.ru
    Дата: 25.02.13 07:20
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам.


    К сожалению, необходимость умным людям придумывать себе работу, портит коммерческие языки программирования. В C# есть некоторые недостатки, но они не так важны.

    На мой взгляд, на данном этапе команду C# надо занять трудоёмкой и полезной работой, которая не приведёт к бесконтрольному росту языка.

    Я бы предложил им переписать компилятор, чтобы намного сильнее увеличить уровень оптимизации. Что-то типа LTCG (именно на уровне байт кода) было бы здорово получить.
    Re: Что нужно добавить в C#?
    От: Osaka  
    Дата: 28.02.13 01:23
    Оценка:
    Записывать guid без кавычек и прочих выкрутасов, как обычное число.
    Не
    id = new Guid("218a8084-1e3d-4afa-8783-41df0147032d")

    а
    id = g218a80841e3d4afa878341df0147032d

    или ещё лучше в base64 (24 символа)
    Друга ищи не того, кто любезен с тобой, кто с тобой соглашается, а крепкого советника, кто полезного для тебя ищет и противится твоим необдуманным словам.
    Re[6]: Что нужно добавить в C#?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.13 04:15
    Оценка: 12 (1)
    Здравствуйте, VladD2, Вы писали:

    IT>>Могу за 20K в аналогичной валюте сделать ревью дизайна Влада. Если оно окажется типа "Всё OK", то всё равно бабки вперёд.

    VD>Я не против. Все равно по сравнению с их затратами это демпинговые цены. Они же фичу рожают по два года и коллективно.
    Работая в продуктовой конторе, могу вас, пацаны, разочаровать. В нужную работу, помимо проектирования и review, входит также мейнтенанс на пять лет вперёд (т.е. участие в дизайне всех будущих фич с учётом наличия этой существующей) и саппорт на десять лет вперёд (то есть помощь несчастным хомячкам, выстрелившим себе в ногу при помощи вашей фичи).
    Стоимостью реализации при таких раскладах можно смело пренебречь. А запрошенные вами 30к на двоих эти две активности сожрут уже к концу 2014. Дальше вы будете работать себе в убыток.

    А если вы откажетесь от этих "обременений" — то Редмонд ваше предложение никак не заинтересует. У них и своих проектировщиков хватает; с учётом ихних зарплат, проект+ревью им обойдётся тыщи в четыре, от силы в пять.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[2]: Что нужно добавить в C#?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.13 04:17
    Оценка:
    Здравствуйте, SergASh, Вы писали:

    SAS>Здравствуйте, AndrewVK, Вы писали:


    SAS>Нельзя ли сделать так, чтобы enum'ы реализовывали интерфейс IEquatable<> ?

    А блоки итераторов — интерфейс ICloneable<>.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[2]: Что нужно добавить в C#?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.13 04:23
    Оценка: +1
    Здравствуйте, Osaka, Вы писали:
    O>или ещё лучше в base64 (24 символа)
    Стесняюсь спросить — а зачем?
    Я бы ещё понял compile-time checking гуидных констант.
    Но он сам по себе никак не требует переписывания кода — я бы скорее попросил валидации всех выражений new Guid(expr), если expr резолвится в string constant.
    А экономить десяток байт в ущерб читаемости, имхо, нездоровая идея.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re: Что нужно добавить в C#?
    От: GlebZ Россия  
    Дата: 28.02.13 07:38
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    Очень хотелось бы Dispose по exception. Пример, примерно такой:


    class MyClass:IDisposableException
    {
       public MyClass(Context c){...}
       public void Dispose(){ context.Commit();}
       public void Dispose(Exception e)
       {
        context.Rollback();
        Log.Exception(e);
        throw;
       }
    }
    
    void main()
    {
       using(new MyClass(new Context()))
       {
    /// do something
       }
    }


    Синтаксический сахар вырождается примерно в структуру:


    void main()
    {
       var myClass=new MyClass(new Context());
       bool bDisposed;
       try
       {
    ///do something
       }
       catch(Exception e)
       {
          myClass.Dispose(e);
          bDisposed=true;
       }
       finally
       {
          if (!bDisposed)
              myClass.Dispose();
       }
    
    }


    Доработка простая как 2 копейки. Но периодически её сильно не хватает.
    Re[2]: Что нужно добавить в C#?
    От: GlebZ Россия  
    Дата: 28.02.13 08:13
    Оценка:
    Да и еще хотелось бы иметь switch по типам. Лучше даже в виде проверки is.

    switch (myObj)
    {
       case typeof(MyClass):....
       case typeof(MyClass2):....
    }


    Ручной полиморфизм иногда пригождается. Кроме того он более управляем, чем перегрузка методов.
    Re[3]: Что нужно добавить в C#?
    От: Osaka  
    Дата: 28.02.13 09:11
    Оценка:
    O>>или ещё лучше в base64 (24 символа)
    S>Стесняюсь спросить — а зачем?
    Меньше занимает места на экране.
    Друга ищи не того, кто любезен с тобой, кто с тобой соглашается, а крепкого советника, кто полезного для тебя ищет и противится твоим необдуманным словам.
    Re[3]: Что нужно добавить в C#?
    От: Osaka  
    Дата: 28.02.13 09:45
    Оценка:
    S>Стесняюсь спросить — а зачем?
    А вообще идея возникла из неудобного выделения мышью (надо бы как число или слово — dblclick в 1 точке, а приходится вручную выцеливаться в начало и конец).
    Друга ищи не того, кто любезен с тобой, кто с тобой соглашается, а крепкого советника, кто полезного для тебя ищет и противится твоим необдуманным словам.
    Re[2]: Что нужно добавить в C#?
    От: Yoriсk  
    Дата: 28.02.13 10:40
    Оценка:
    Здравствуйте, Osaka, Вы писали:

    O>
    id = g218a80841e3d4afa878341df0147032d


    И как понять компилятору: это guid или переменная?

    Зарезервируем все guid-ы?
    Re[4]: Что нужно добавить в C#?
    От: Sinix  
    Дата: 28.02.13 10:50
    Оценка:
    Здравствуйте, Osaka, Вы писали:

    S>>Стесняюсь спросить — а зачем?

    O>А вообще идея возникла из неудобного выделения мышью (надо бы как число или слово — dblclick в 1 точке, а приходится вручную выцеливаться в начало и конец).
    Двойной щелчок перед открывающей кавычкой пробовали?
    Re[4]: Что нужно добавить в C#?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.13 12:54
    Оценка:
    Здравствуйте, Osaka, Вы писали:
    O>Меньше занимает места на экране.
    Омг. Если вам неважно это значение, схлопните регион, в котором оно.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[4]: Что нужно добавить в C#?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.02.13 12:55
    Оценка: +3
    Здравствуйте, Osaka, Вы писали:

    S>>Стесняюсь спросить — а зачем?

    O>А вообще идея возникла из неудобного выделения мышью (надо бы как число или слово — dblclick в 1 точке, а приходится вручную выцеливаться в начало и конец).
    ОМГ. То есть вы предлагаете вместо починки IDE починить язык? Ну-ну.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[4]: Что нужно добавить в C#?
    От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
    Дата: 28.02.13 13:08
    Оценка:
    Здравствуйте, Osaka, Вы писали:

    S>>Стесняюсь спросить — а зачем?

    O>А вообще идея возникла из неудобного выделения мышью (надо бы как число или слово — dblclick в 1 точке, а приходится вручную выцеливаться в начало и конец).

    Это элементарно исправляется выкидыванием мыши установкой VsVim. Выделение строки: vi". Всё просто!
    Ce n'est que pour vous dire ce que je vous dis.
    Re[4]: Что нужно добавить в C#?
    От: Аноним  
    Дата: 28.02.13 13:21
    Оценка:
    Здравствуйте, Osaka, Вы писали:

    S>>Стесняюсь спросить — а зачем?

    O>А вообще идея возникла из неудобного выделения мышью (надо бы как число или слово — dblclick в 1 точке, а приходится вручную выцеливаться в начало и конец).

    Resharper: Ctrl+W. И несколько раз до расширения выделения до нужных границ.
    Re[3]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 28.02.13 15:04
    Оценка:
    Здравствуйте, Ziaw, Вы писали:

    Z>FieldOffsetAttribute доступен с первого фреймворка.


    Попробуй, ради хохмы, таким образом совместить ссылочный тип и какой-нибудь long. Узнаешь много нового.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: Что нужно добавить в C#?
    От: х Россия  
    Дата: 28.02.13 16:10
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    Из мелкого мне бы хотелось возможность наследовать парралельные ветки:


        //Base interfaces
        interface IXmlNode
        {
            IList<IXmlNode> Children { get; }
        }
    
        interface IXmlElement : IXmlNode
        {
        }
    
        // Simple implementation
        class XmlNodeBase : IXmlNode
        {
            public IList<IXmlNode> Children
            {
                get { return children; }
            }
            IList<IXmlNode> children = new List<IXmlNode>();
        }
    
        class XmlElementBase : XmlNodeBase, IXmlElement
        {
        }
    
        //Real Implementation
        class MsXmlNode : XmlNodeBase
        {
        }
    
        class MsXml : MsXmlNode, XmlElementBase//Error here!
        {
        }


    Из крупного хочется мочь создавать доменные языки сразу в коде, на пример пусть я хочу чтобы, у Dictionary можно было указывать название свойств вместо Key и Value, для этого делаю свою лексему:

    //создаю лексему, которая ведёт себя как тип
        let dictionary = dictionary<KeyType KeyName, ValueType ValueName> : Type
            where KeyType: Type, KeyName: Identifier, ValueType: Type, ValueType: Identifier
        {
            class @item : KeyValuePair<KeyType, ValueType>
            {
                public KeyType KeyName { get { return base.Key; } set { base.Key = value; }}
                public ValueType ValueName { get { return base.Value; } set { base.Value = value; }}
            }
            class @ : IEnumerable<@item>
            {
            }
        }
    
    //В итоге могу писать так:
    var test = new dictionary<string passport, string fullname>();
    foreach(var i in test)
        Console.WriteLine("{0}->{1}", i.passport, i.fullname);
    С уважением Вадим.
    Re[7]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 28.02.13 16:40
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Работая в продуктовой конторе, могу вас, пацаны, разочаровать. В нужную работу, помимо проектирования и review, входит также мейнтенанс на пять лет вперёд


    Ты видимо кем-то не тем работаешь. Любой работник отдела кадров и директор знает, что есть разные специалисты отвечающие за разные задачи. По идее не нужно быть курицей чтобы понимать толк в яичнице, но чем черт не шутит?
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: Что нужно добавить в C#?
    От: Osaka  
    Дата: 28.02.13 16:42
    Оценка: :)
    Y>И как понять компилятору: это guid или переменная?
    По длине
    Друга ищи не того, кто любезен с тобой, кто с тобой соглашается, а крепкого советника, кто полезного для тебя ищет и противится твоим необдуманным словам.
    Re[5]: Что нужно добавить в C#?
    От: Osaka  
    Дата: 28.02.13 16:42
    Оценка:
    S>ОМГ. То есть вы предлагаете вместо починки IDE починить язык? Ну-ну.
    Зачем делать не-интуитивнопонятные
    Автор: Don Reba
    Дата: 28.02.13
    выкрутасы
    Автор:
    Дата: 28.02.13
    в иде, если можно сделать чётко и лаконично в языках?
    Друга ищи не того, кто любезен с тобой, кто с тобой соглашается, а крепкого советника, кто полезного для тебя ищет и противится твоим необдуманным словам.
    Re[5]: Что нужно добавить в C#?
    От: Osaka  
    Дата: 28.02.13 16:42
    Оценка:
    S>Двойной щелчок перед открывающей кавычкой пробовали?
    Неудобно, нужно точно попадать и кавычки отрезАть потом (чтобы, например, в sql-запрос вписать).
    Друга ищи не того, кто любезен с тобой, кто с тобой соглашается, а крепкого советника, кто полезного для тебя ищет и противится твоим необдуманным словам.
    Re[5]: Что нужно добавить в C#?
    От: Osaka  
    Дата: 28.02.13 16:42
    Оценка:
    S>Если вам неважно это значение, схлопните регион, в котором оно.
    А если важно, и их несколько в строке?
    Друга ищи не того, кто любезен с тобой, кто с тобой соглашается, а крепкого советника, кто полезного для тебя ищет и противится твоим необдуманным словам.
    Re[7]: Что нужно добавить в C#?
    От: IT Россия linq2db.com
    Дата: 28.02.13 22:47
    Оценка: :)
    Здравствуйте, Sinclair, Вы писали:

    S>А если вы откажетесь от этих "обременений" — то Редмонд ваше предложение никак не заинтересует. У них и своих проектировщиков хватает; с учётом ихних зарплат, проект+ревью им обойдётся тыщи в четыре, от силы в пять.


    Убедил. Я отказываюсь от своего предложения.
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[4]: Что нужно добавить в C#?
    От: alexanderfedin США http://alexander-fedin.pixels.com/
    Дата: 01.03.13 01:07
    Оценка: :)
    Здравствуйте, Don Reba, Вы писали:

    overquoting

    Зачем в языке делать то, что можно сделать в библиотеке?
    IEnumerable<Tuple<T, int>> WithIndex(this IEnumerable<T> sequence)
    {
        int i = 0;
        foreach (var elem in sequence)
        {
            yield return Tuple.Create(elem, i++);
        }
    }
    Respectfully,
    Alexander Fedin.
    Re[5]: Что нужно добавить в C#?
    От: alexanderfedin США http://alexander-fedin.pixels.com/
    Дата: 01.03.13 01:20
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    overquoting
    А>Какие проблемы у Скита решаются с помощью class enum мне понять вообще не удалось.

    А>То есть, я боюсь, что если и сделают енамы более объектными, то вместо маленького нужного инструмента зафигачат большой и ненужный. Если кому-то нужен класс и enum в одном флаконе, пусть пишет, как в PHP, то есть, класс с константами, с методами, конструкторами и прочим. А чтобы не копипастить код, когда уже есть enum, а свой такой класс надо построить на его базе, вполне достаточно поддержать наследование. И наследование самих enum'ов, конечно. Тоже не хватает, чтобы, допустим, от enum'а с секундой унаследовать как СИ, так и грамм-секундную систему. И чтобы секунда там и там была одной и той же.


    public enum LengthUnit
    {
        Millimeter = 1,
        Meter = 1000,
        Inch = 25400;
    }
    
    public static class LengthUnitExtensions
        public static LengthUnit Parse(this string text)
        {
            if (text == "mm") return LengthUnit.Millimeter;
            if (text == "m") return LengthUnit.Meter;
            if (text == "\"") return LengthUnit.Inch;
        }
    
        public string GetSystem(this LengthUnit value)
        {
            switch (value)
            {
                case LengthUnit.Millimeter:
                case LengthUnit.Meter:
                    return "Metric";
                case LengthUnit.Inch:
                    return "US";
                default: return string.Empty;
            }
        }
    }
    
    ...
    
    var system = "mm".Parse().GetSystem();
    Respectfully,
    Alexander Fedin.
    Re[6]: Что нужно добавить в C#?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 01.03.13 02:10
    Оценка:
    Здравствуйте, Osaka, Вы писали:

    O>Зачем делать не-интуитивнопонятные
    Автор: Don Reba
    Дата: 28.02.13
    выкрутасы
    Автор:
    Дата: 28.02.13
    в иде, если можно сделать чётко и лаконично в языках?

    Затем, что каждому своё.
    Язык нужен для того, чтобы его было легко читать человеку.
    IDE нужна для того, чтобы на этом легкочитаемом языке было легко писать.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[6]: Что нужно добавить в C#?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 01.03.13 02:10
    Оценка:
    Здравствуйте, Osaka, Вы писали:

    S>>Если вам неважно это значение, схлопните регион, в котором оно.

    O>А если важно, и их несколько в строке?
    Если важно, то base64 — отвратительная идея. Хуже неё — только base64 от gzip от guid.
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[4]: Что нужно добавить в C#?
    От: Ziaw Россия  
    Дата: 01.03.13 14:44
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Попробуй, ради хохмы, таким образом совместить ссылочный тип и какой-нибудь long. Узнаешь много нового.


    А какой в этом смысл в мире управляемых указателей?
    Re: Что нужно добавить в C#?
    От: Flammable Россия  
    Дата: 01.03.13 16:07
    Оценка:
    Хотелось бы объявлять операторы в интерфейсах.
    И какой-нибудь механизм, позволяющий писать дженерики, принимающие только numeric-типы, например (общем случае реализующие какой-то набор операторов).
    Re[5]: Что нужно добавить в C#?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 01.03.13 16:40
    Оценка:
    Здравствуйте, Ziaw, Вы писали:

    VD>>Попробуй, ради хохмы, таким образом совместить ссылочный тип и какой-нибудь long. Узнаешь много нового.


    Z>А какой в этом смысл в мире управляемых указателей?


    Смысл может быть любой. Он задачей определяется. Это же просто объединение двух величин. Например, строки и целого. А вот работать не будет, так как CLR не позволяет совместить указатель и значение. GC тупо упадет.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: Что нужно добавить в C#?
    От: Silver_S Ниоткуда  
    Дата: 01.03.13 17:03
    Оценка:
    Сокращенное написание такого проперти:

    int _prop;
    int Prop
    {
       get{ return _prop; }
       set
       {
         if(_prop!=value)
         {
            _prop=value;
            Update();
         }
       }
    }


    Сокращенная форма того же самого:
    int Prop{ onchange { Update(); } }

    Или существующий keyword приспособить, например, new
    Re[6]: Что нужно добавить в C#?
    От: Flammable Россия  
    Дата: 01.03.13 17:23
    Оценка:
    Здравствуйте, VladD2, Вы писали:
    VD>А вот работать не будет, так как CLR не позволяет совместить указатель и значение. GC тупо упадет.
    Указатель и значение CLR позволяет "совместить". Не допускается перекрытие типов-ссылок с типами-значениями.
    Re: Что нужно добавить в C#?
    От: Flammable Россия  
    Дата: 01.03.13 18:03
    Оценка:
    Еще добавить полноценную поддержку MMX/SSE для оптимизации вычислений с плавающей точкой.
    Re[2]: Что нужно добавить в C#?
    От: hardcase Пират http://nemerle.org
    Дата: 01.03.13 18:31
    Оценка:
    Здравствуйте, Flammable, Вы писали:

    F>Еще добавить полноценную поддержку MMX/SSE для оптимизации вычислений с плавающей точкой.


    Это возможно реализовать только с изменением рантайма, сам язык для поддержки интринзиков менять не нужно. В Mono такое сделали, но я даже не уверен что этим API кто-либо пользуется.
    /* иЗвиНите зА неРовнЫй поЧерК */
    Re[3]: Что нужно добавить в C#?
    От: Flammable Россия  
    Дата: 01.03.13 18:50
    Оценка:
    Здравствуйте, hardcase, Вы писали:
    H>Это возможно реализовать только с изменением рантайма, сам язык для поддержки интринзиков менять не нужно. В Mono такое сделали, но я даже не уверен что этим API кто-либо пользуется.
    Мало ли, вдруг и рантайм обновят. Сравнения производительности вычислений на c++ и c# гуглятся и показывают дикое отставание последнего. Игнорирование MMX/SSE — одна из далеко не последних причин.
    Re[6]: Что нужно добавить в C#?
    От: Ziaw Россия  
    Дата: 02.03.13 07:13
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Смысл может быть любой. Он задачей определяется. Это же просто объединение двух величин. Например, строки и целого. А вот работать не будет, так как CLR не позволяет совместить указатель и значение. GC тупо упадет.


    Ты про то, что GC следит за всеми указателями и падает если испортить один из них? Есть такая проблема, да, нельзя смешать value и cсылку. Два значения смешать нет проблем, а две ссылки смешивать нет смысла (можно просто хранить один object).
    Re[5]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 03.03.13 12:32
    Оценка:
    Здравствуйте, kkolyan, Вы писали:

    K>попробовал выполнить код(ниже) на жаве и сишарп


    При чем тут джава? Ты 32 и 64 бита сравни, да не на синтетике, а на реальном коде.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[2]: В C# уже и так многое добавили
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 03.03.13 12:33
    Оценка:
    Здравствуйте, Xentrax, Вы писали:

    X>Я бы предложил им переписать компилятор, чтобы намного сильнее увеличить уровень оптимизации.


    Основные оптимизации в дотнете производит не компилятор, а джит. И да, компилятор уже переписан.

    X> Что-то типа LTCG (именно на уровне байт кода) было бы здорово получить.


    Жди СТР нового JITа.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[2]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 03.03.13 12:42
    Оценка: +1
    Здравствуйте, Osaka, Вы писали:

    O>Записывать guid без кавычек и прочих выкрутасов, как обычное число.


    Еще один literal of the day с применением 1 штука на мегабайт кода?
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[2]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 03.03.13 12:44
    Оценка:
    Здравствуйте, Silver_S, Вы писали:

    S_S>Сокращенное написание такого проперти:


    Эта фича чаще всего запрашивается. Мэдс пару вариантов синтаксиса показывал, но там довольно много всяких побочных вопросов.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[2]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 03.03.13 12:45
    Оценка: 7 (2)
    Здравствуйте, Flammable, Вы писали:

    F>Еще добавить полноценную поддержку MMX/SSE для оптимизации вычислений с плавающей точкой.


    Должно быть в следующей версии JIT.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[3]: Что нужно добавить в C#?
    От: QrystaL Украина  
    Дата: 03.03.13 13:24
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:
    AVK>Должно быть в следующей версии JIT.
    А хотя бы ориентировочные сроки выхода есть? (2013, 2014, ...)?
    Re[7]: Что нужно добавить в C#?
    От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
    Дата: 03.03.13 18:27
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    существующей) и саппорт на десять лет вперёд (то есть помощь несчастным хомячкам, выстрелившим себе в ногу при помощи вашей фичи).
    S>Стоимостью реализации при таких раскладах можно смело пренебречь. А запрошенные вами 30к на двоих эти две активности сожрут уже к концу 2014. Дальше вы будете работать себе в убыток.

    Скорее к концу 2013.
    Re[3]: В C# уже и так многое добавили
    От: Xentrax Россия http://www.lanovets.ru
    Дата: 03.03.13 19:37
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    X>>Я бы предложил им переписать компилятор, чтобы намного сильнее увеличить уровень оптимизации.


    AVK>Основные оптимизации в дотнете производит не компилятор, а джит.


    Вот и я про то же. Основной бич программ на байт коде — время запуска. Конечно, MS очевидно хочет, чтобы в будущем весь софт выгружался с marketplace уже скомпилированный Ngen-ом. Но на ближайшие лет десять могли бы написать универсальный оптимизатор именно байт-кода, который производил бы тот же байт код.

    X>> Что-то типа LTCG (именно на уровне байт кода) было бы здорово получить.


    AVK>Жди СТР нового JITа.


    В принципе, если все найденные на жестких, сетевых и съемных дисках пользователя .Net программы будут заранее компилироваться операционной системой и складываться в некий кэш, то необходимость в оптимизации на уровне языка отпадет навсегда.


    P.S. Поясните, плиз, лучше про компилятор, который "уже" переписали? Уже это когда? И что именно переписали?
    Re[4]: Что нужно добавить в C#?
    От: alexanderfedin США http://alexander-fedin.pixels.com/
    Дата: 03.03.13 22:07
    Оценка:
    Здравствуйте, agat50, Вы писали:

    A>Здравствуйте, Aлeкceй, Вы писали:


    A>>А что мешает моно на сервер поставить?


    A>Мешает то, что банальнейшая прога на winforms .net4.0 c mysql коннектором (который специально под mono) на убунте с 2.10.8.1 вылетает при запуске с замечательной ошибкой " Could not load file or assembly 'MySql.Data, Version=6.5.5.0, ...", которая валяется в той же папке. И какая тут "Yes, Mono is binary compatible with Windows."? Не тянет писать под Mono с его приколами, а не под .net как единую платформу аля java. В принципе всё решаемо, опять-таки java либы через ikvm можно на крайний случай для кроссплатформенности использовать. MS мог бы выпустить CLR под линукс, мб и с покоцанным функционалом типа wpf, хоть серваки гонять, но чтобы работало всё так же как на винде.

    Зачем Майкрософту рубить сук, на котором он сидит?
    Компания зарабатывает деньги не на продаже .NET, а на продаже операционной системы Windows. .NET — это средство для облегчения создания программ под Windows сторонним производителям, а не способ облегчить перенос этих программ на другие платформы.
    Именно поэтому компания поддерживает платформу Mono ровно настолько, чтобы её не обвинили в монополизме, и ни на грамм больше.
    Respectfully,
    Alexander Fedin.
    Re[5]: Что нужно добавить в C#?
    От: agat50  
    Дата: 03.03.13 22:55
    Оценка:
    Здравствуйте, alexanderfedin, Вы писали:

    A>Зачем Майкрософту рубить сук, на котором он сидит?

    A>Компания зарабатывает деньги не на продаже .NET, а на продаже операционной системы Windows. .NET — это средство для облегчения создания программ под Windows сторонним производителям, а не способ облегчить перенос этих программ на другие платформы.
    A>Именно поэтому компания поддерживает платформу Mono ровно настолько, чтобы её не обвинили в монополизме, и ни на грамм больше.

    Спасибо кэп, открыли глаза Момент в том, что dotnet и C# как пророк его возможно мог бы продаваться "лучше" винды. Как отдельный продукт. Ну естественно по другим ценам, но по 10 баксов за лицензию бессрочную на систему можно было бы за него платить. Ну а с виндой вроде как бесплатно бы шёл. Как это сделать вопрос второй. В принципе да, особых надежд не питаю. Если бы было бесплатно, то это скорее уже была бы java с её недостатками из-за отсутствия централизации.
    Re[4]: В C# уже и так многое добавили
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 04.03.13 01:42
    Оценка: +1
    Здравствуйте, Xentrax, Вы писали:

    X>Конечно, MS очевидно хочет, чтобы в будущем весь софт выгружался с marketplace уже скомпилированный Ngen-ом.


    При чем тут marketplace? Ngen прекрасно работает с любыми дотнетными сборками.

    X> Но на ближайшие лет десять могли бы написать универсальный оптимизатор именно байт-кода, который производил бы тот же байт код.


    Это малоэффективно, потому что большая часть оптимизаций для императивных языков требует знания архитектуры процессора.

    AVK>>Жди СТР нового JITа.


    X>В принципе, если все найденные на жестких, сетевых и съемных дисках пользователя .Net программы будут заранее компилироваться операционной системой и складываться в некий кэш, то необходимость в оптимизации на уровне языка отпадет навсегда.


    Оно уже именно так и работает.

    X>P.S. Поясните, плиз, лучше про компилятор, который "уже" переписали? Уже это когда? И что именно переписали?


    Компилятор. Полностью. На C#. Это одна из составных частей Розлина.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[4]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 04.03.13 01:42
    Оценка:
    Здравствуйте, QrystaL, Вы писали:

    AVK>>Должно быть в следующей версии JIT.

    QL>А хотя бы ориентировочные сроки выхода есть? (2013, 2014, ...)?

    СТР должен быть скоро. А что касается релиза — у меня никаких данных нет.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[5]: В C# уже и так многое добавили
    От: GlebZ Россия  
    Дата: 04.03.13 07:47
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    AVK>При чем тут marketplace? Ngen прекрасно работает с любыми дотнетными сборками.

    Неверно. Для ngen требуются административные права. Это приводит к невозможности его использования в моих приложениях. Для меня ngen'a — нету.
    Re[6]: Что нужно добавить в C#?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 04.03.13 12:10
    Оценка:
    Здравствуйте, agat50, Вы писали:

    A>Момент в том, что dotnet и C# как пророк его возможно мог бы продаваться "лучше" винды.


    На фоне бесплатной джавы?
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[6]: В C# уже и так многое добавили
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 04.03.13 12:10
    Оценка:
    Здравствуйте, GlebZ, Вы писали:

    GZ>Неверно. Для ngen требуются административные права.


    Для инсталляторов обычно тоже.

    GZ> Это приводит к невозможности его использования в моих приложениях.


    Современные фреймворки запускают ngen для часто используемых сборок самостоятельно, в том числе и для твоих продуктов.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[7]: Что нужно добавить в C#?
    От: agat50  
    Дата: 04.03.13 12:17
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, agat50, Вы писали:


    A>>Момент в том, что dotnet и C# как пророк его возможно мог бы продаваться "лучше" винды.


    AVK>На фоне бесплатной джавы?


    Ну винда же продаётся на фоне бесплатной убунты. Мне, например, шарп нравится весьма как язык, почему бы и не платить. Естественно, если это будет удобно осуществимо.
    Re[7]: Что нужно добавить в C#?
    От: Евгений Акиньшин grapholite.com
    Дата: 04.03.13 12:19
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Здравствуйте, agat50, Вы писали:


    A>>Момент в том, что dotnet и C# как пророк его возможно мог бы продаваться "лучше" винды.


    AVK>На фоне бесплатной джавы?


    Ксамарин для Андроида продается на фоне бесплатной явы.
    Не шалю, никого не трогаю, починяю примус Diagrams Designer for iPad and Windows 10
    Re[7]: В C# уже и так многое добавили
    От: GlebZ Россия  
    Дата: 04.03.13 14:24
    Оценка: +1
    Здравствуйте, AndrewVK, Вы писали:

    GZ>>Неверно. Для ngen требуются административные права.

    AVK>Для инсталляторов обычно тоже.
    Ваще-то нет. Всё прекрасно ставится в профайл, и прекрасно работает в терминалках.
    Ладно, я вполне понимаю зачем они требуют для ngen — full trust. На здоровье, мне на это наплевать. Но зачем требовать административных прав для запуска ngen, когда он спокойно компилируется в профайл — мне непонятно.

    GZ>> Это приводит к невозможности его использования в моих приложениях.

    AVK>Современные фреймворки запускают ngen для часто используемых сборок самостоятельно, в том числе и для твоих продуктов.
    Таких эффектов замечено не было. Где почитать?
    Re: Что нужно добавить в C#?
    От: Аноним  
    Дата: 04.03.13 21:39
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    1. constraint на enum.
    2. public int MyProp { get; set; } = 10 (задалбался для этого заводить конструктор)
    3. (почти как 2). Дать возможность инициализировать поля как private MyContainer _containter = new MyContainer(this);
    4. var f = x => x + 1; Хочется, чтобы был авто-вывод к Func и Action
    Re[8]: В C# уже и так многое добавили
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 05.03.13 00:04
    Оценка:
    Здравствуйте, GlebZ, Вы писали:

    GZ>Но зачем требовать административных прав для запуска ngen, когда он спокойно компилируется в профайл — мне непонятно.


    Защита от вирусов.

    AVK>>Современные фреймворки запускают ngen для часто используемых сборок самостоятельно, в том числе и для твоих продуктов.

    GZ>Таких эффектов замечено не было. Где почитать?

    http://blogs.msdn.com/b/dotnet/archive/2012/03/20/improving-launch-performance-for-your-desktop-applications.aspx
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re: Что нужно добавить в C#?
    От: ldarcy  
    Дата: 05.03.13 06:15
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    Partial attributes? Чтобы атрибуты на член класса можно было указывать в разных файлах.
    Re[4]: Что нужно добавить в C#?
    От: nikov США http://www.linkedin.com/in/nikov
    Дата: 06.03.13 18:00
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>спасибо : ) не знал про этот странный нюанс.


    Хотя о нём явно написано в спеке: 10.7.3 Automatically implemented properties
    Re: Анонимные классы, модули, вычисляемые строки и пр.
    От: iHateLogins  
    Дата: 08.03.13 07:23
    Оценка: 11 (1)
    1) Анонимные классы как в джаве
    2) Модули из CLR
    3) свитчи по типам
    4) кейс-инсенситив свитч (инвариант)
    5) Вычисляемые строки как в повершелле ("@var") — пусть хотя бы и с возможностью использования только переменных и полей в области видимости.
    6) catch нескольких типов сразу catch(IOException, FileNotFoundException){}
    7) internals visible only to на уровне классов (для проектов, у которых одна большая ДЛЛ и не хочется "делиться" внутренностями класса со всеми)
    8) Байндинг одного алиаса к нескольким неймспейсам.
    Re: Что нужно добавить в C#?
    От: Евгений Акиньшин grapholite.com
    Дата: 08.03.13 13:03
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    1) Возврат множества значений из функции, что-нибудь типа:


    public (string a, int b) Function()
    {
      return new { a = "text", b  = 1 };
    }


    2) Более мощная система ограничений для дженериков, в частности ограничения на поддержку перегруженных операторов

    3) Дефолтные реализации методов в интерфейсах (что-то типа трейтов)

    4) Null safety — not nullable types.

    Что-то типа


    string! str = null; //compile time error



    Хейлсберг говорил в интервью, что они этого не делают, потому что при использовании в существующих библиотеках это поломает совместимость. Но кто мешает не использовать эту фичу в старых апи?

    5) Упрощенный синтаксис для лямбд без параметров или с одним параметром, по типу того, как сделано в Котлине. Чтобы там, где ожидается лямбда, можно было бы писать ее без лишних скобок

    чтобы вместо

      list.Where(it => it < 5);


    было

      list.Where(it < 5);


    а если еще и позволить использовать операторный синтаксис для методов с одним параметром, то можно даже так:

    
    list where it < 5



    6) Ну и главная хотелка это конечно мета-программирование, хотя бы для простейших случаев:


    
    [RaisesPropertyChanged]
    public string Str {get; set; }


    Но это, как я понимаю, выходит за рамки вопроса о небольших улучшениях.
    Не шалю, никого не трогаю, починяю примус Diagrams Designer for iPad and Windows 10
    Re[2]: Что нужно добавить в C#?
    От: Цыба Украина  
    Дата: 08.03.13 13:10
    Оценка:
    Здравствуйте, Евгений Акиньшин, Вы писали:

    ЕА>5) Упрощенный синтаксис для лямбд без параметров или с одним параметром, по типу того, как сделано в Котлине. Чтобы там, где ожидается лямбда, можно было бы писать ее без лишних скобок


    ЕА>чтобы вместо


    ЕА>
    ЕА>  list.Where(it => it < 5);
    ЕА>


    ЕА>было


    ЕА>
    ЕА>  list.Where(it < 5);
    ЕА>


    ЕА>[/c#]


    По-моему, дикость. Что если метод, подобный Where, будет принимать boolean в одной из своих перегрузок?
    Re[3]: Что нужно добавить в C#?
    От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
    Дата: 08.03.13 13:23
    Оценка:
    Здравствуйте, Цыба, Вы писали:

    Ц>По-моему, дикость. Что если метод, подобный Where, будет принимать boolean в одной из своих перегрузок?


    В Немерле решается использованием подчёркивания вместо имени переменной. Причём, работает и для лямбд с несколькими параметрами:

    [2, 3, 5].Aggregate(_ * _) // 30
    Ce n'est que pour vous dire ce que je vous dis.
    Re[3]: Что нужно добавить в C#?
    От: iHateLogins  
    Дата: 12.03.13 08:15
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    O>>Записывать guid без кавычек и прочих выкрутасов, как обычное число.

    AVK>Еще один literal of the day с применением 1 штука на мегабайт кода?

    Как насчёт 0x синтакса из T-SQL?
    Re[4]: Что нужно добавить в C#?
    От: Klikujiskaaan КНДР  
    Дата: 12.03.13 09:41
    Оценка: :)))
    Здравствуйте, Don Reba, Вы писали:

    DR>Здравствуйте, Цыба, Вы писали:


    Ц>>По-моему, дикость. Что если метод, подобный Where, будет принимать boolean в одной из своих перегрузок?


    DR>В Немерле решается использованием подчёркивания вместо имени переменной. Причём, работает и для лямбд с несколькими параметрами:


    DR>
    [2, 3, 5].Aggregate(_ * _) // 30


    Жопа какая-то :D
    Re[3]: В C# уже и так многое добавили
    От: sgrape Россия  
    Дата: 13.03.13 11:03
    Оценка: 1 (1) +4 -1
    Здравствуйте, AndrewVK, Вы писали:

    X>>Я бы предложил им переписать компилятор, чтобы намного сильнее увеличить уровень оптимизации.

    AVK>Основные оптимизации в дотнете производит не компилятор, а джит.

    Похоже, что ничего за 10 лет не изменилось.
    Те, кто делают компилятор думают, что оптимизировать будет джит.
    А те, кто делают джит — оптимизацией не занимаются, чтобы не тормозил запуск приложений.
    В результате все в пролете.

    X>> Но на ближайшие лет десять могли бы написать универсальный оптимизатор именно байт-кода, который производил бы тот же байт код.

    AVK>Это малоэффективно, потому что большая часть оптимизаций для императивных языков требует знания архитектуры процессора.

    Очень жаль, если команда дотнета так считает.
    Значит никаких высокоуровневых оптимизаций просто не будет.

    Как джит поможет превратить вот это:

                list.ForEach((item) =>
                    {
                        item.SetValue(1);
                    });


    например в это:

                for (int i = 0; i < list._array.Length; i++)
                {
                    list._array[i]._value = 1;
                }


    последовательно совершив инлайнинг лямбды внутрь ForEach, затем превратив ForEach в for, вытащив массив изнутри списка и выкинув проверки на границы массива в индексаторе?
    А ведь это только одна из элементарных оптимизаций, которые хотелось бы видеть в дотнете.

    Да просто чтобы развернуть цикл или сделать глобальный сквозной инлайнинг (чтобы схлопнуть многоуровневые вызовы мелких фукций) — разве надо знать архитектуру процессора?

    Но очевидно, ничего этого не будет, пока оптимизацией делает вид что занимается джит.

    И при чем тут императивные языки, если в дотнете сейчас тормозит вообще все?
    Начиная от базовых вещей типа рефлекшена и сериализации, и заканчивая библиотеками вроде WPF.
    Тут оптимизировать надо абсолютно все и на всех уровнях.

    Оптимизатор уровня байт-кода, про который говорит Xentrax — как раз во многом помог бы.
    Например, генерацией дополнительного кода (для рефлекшона/сериализации), выкидыванием лишних проверок (проанализировав, что они не нужны), трансформацией одних конструкций в другие, тотальным инлайнингом и т.п.

    И в частности это решило бы вечную проблему, кто должен оптимизировать: джит или компилятор.

    PS: а по теме — ничего от С# не надо, пока приходится для всех объектов писать самопальную (зато быструю и компактную) сериализацию да переписывать код в стиле С, когда скорость нужна.
    Re[7]: Что нужно добавить в C#?
    От: WolfHound  
    Дата: 13.03.13 13:01
    Оценка:
    Здравствуйте, Ziaw, Вы писали:

    Z>Ты про то, что GC следит за всеми указателями и падает если испортить один из них? Есть такая проблема, да, нельзя смешать value и cсылку. Два значения смешать нет проблем, а две ссылки смешивать нет смысла (можно просто хранить один object).

    Такая проблема есть в реализации .НЕТного ГЦ, а не ГЦ вообще.
    Ибо ни что не мешает сделать ГЦ, который понимает, в каком состоянии находится объединение.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[4]: В C# уже и так многое добавили
    От: WolfHound  
    Дата: 13.03.13 14:45
    Оценка:
    Здравствуйте, sgrape, Вы писали:

    S>PS: а по теме — ничего от С# не надо, пока приходится для всех объектов писать самопальную (зато быструю и компактную) сериализацию да переписывать код в стиле С, когда скорость нужна.

    Попробуй немерле. То о чем ты говоришь, на макросах автоматизируется на раз.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[8]: Что нужно добавить в C#?
    От: GlebZ Россия  
    Дата: 13.03.13 15:29
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Ибо ни что не мешает сделать ГЦ, который понимает, в каком состоянии находится объединение.

    Это не вариативный тип. union отличается тем, что это кусок памяти с данными который программист может интерпретировать как ему заблагорасудится. GC — себе такого позволить не может. Определить, что это long или указатель, или вообще и то и другое без дополнительных знаний — невозможно.
    Re[9]: Что нужно добавить в C#?
    От: WolfHound  
    Дата: 13.03.13 15:43
    Оценка:
    Здравствуйте, GlebZ, Вы писали:

    GZ>Это не вариативный тип. union отличается тем, что это кусок памяти с данными который программист может интерпретировать как ему заблагорасудится. GC — себе такого позволить не может. Определить, что это long или указатель, или вообще и то и другое без дополнительных знаний — невозможно.

    Бывают такие юнионы, которые содержат в себе флаг, указывающий в каком они состоянии.
    Я такими каждый день пользуюсь.
    И для них нет никаких проблем узнать, что там лежит.

    Причем для этого флага не всегда даже нужно заводить отдельную память.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[8]: Что нужно добавить в C#?
    От: Ziaw Россия  
    Дата: 13.03.13 15:44
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Такая проблема есть в реализации .НЕТного ГЦ, а не ГЦ вообще.

    WH>Ибо ни что не мешает сделать ГЦ, который понимает, в каком состоянии находится объединение.

    Для того, чтобы это понимать, объединение должно это состояние хранить. А это уже не очень честное объединение.
    Re[9]: Что нужно добавить в C#?
    От: WolfHound  
    Дата: 13.03.13 16:15
    Оценка:
    Здравствуйте, Ziaw, Вы писали:

    Z>Для того, чтобы это понимать, объединение должно это состояние хранить. А это уже не очень честное объединение.

    Для того чтобы разумно работать с объединением тебе в любом случае нужно состояние. В том или ином виде.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[4]: В C# уже и так многое добавили
    От: k0st1x Марс  
    Дата: 13.03.13 17:02
    Оценка:
    Здравствуйте, sgrape, Вы писали:

    S>Как джит поможет превратить вот это:


    S>
    S>            list.ForEach((item) =>
    S>                {
    S>                    item.SetValue(1);
    S>                });
    
    S>


    S>например в это:


    S>
    S>            for (int i = 0; i < list._array.Length; i++)
    S>            {
    S>                list._array[i]._value = 1;
    S>            }
    
    S>


    S>последовательно совершив инлайнинг лямбды внутрь ForEach, затем превратив ForEach в for, вытащив массив изнутри списка и выкинув проверки на границы массива в индексаторе?

    S>А ведь это только одна из элементарных оптимизаций, которые хотелось бы видеть в дотнете.

    я против "инлайнинга из коробки".
    лично мне важно, чтобы stack trace совпадал с исходниками
    Re[4]: В C# уже и так многое добавили
    От: Jack128  
    Дата: 13.03.13 19:31
    Оценка:
    Здравствуйте, sgrape, Вы писали:

    К слову, где то слышал, что ngen и jit оптимизируют абсолютно одинаково. это так??
    Re[5]: В C# уже и так многое добавили
    От: AlexRK  
    Дата: 13.03.13 19:59
    Оценка:
    Здравствуйте, k0st1x, Вы писали:

    K>я против "инлайнинга из коробки".

    K>лично мне важно, чтобы stack trace совпадал с исходниками

    Для этого давно придуманы debug и release.
    Re[4]: Что нужно добавить в C#?
    От: Аноним  
    Дата: 13.03.13 21:02
    Оценка:
    HL>Как насчёт 0x синтакса
    Кстати да. Реализовать поддержку Int128, и не понадобится в языке изобретать ничего нового.
    Re[10]: Что нужно добавить в C#?
    От: Ziaw Россия  
    Дата: 14.03.13 12:47
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Для того чтобы разумно работать с объединением тебе в любом случае нужно состояние. В том или ином виде.


    Мне нужно, но я могу сам выбирать, где и как его хранить. Может я его в один бит умещу, а может буду хранить отдельно диапазоны с одним состоянием для массива объединений.
    Re[6]: Что нужно добавить в C#?
    От: alexanderfedin США http://alexander-fedin.pixels.com/
    Дата: 15.03.13 20:28
    Оценка: +1
    Здравствуйте, agat50, Вы писали:

    A>Здравствуйте, alexanderfedin, Вы писали:


    A>>Зачем Майкрософту рубить сук, на котором он сидит?

    A>>Компания зарабатывает деньги не на продаже .NET, а на продаже операционной системы Windows. .NET — это средство для облегчения создания программ под Windows сторонним производителям, а не способ облегчить перенос этих программ на другие платформы.
    A>>Именно поэтому компания поддерживает платформу Mono ровно настолько, чтобы её не обвинили в монополизме, и ни на грамм больше.

    A>Спасибо кэп, открыли глаза Момент в том, что dotnet и C# как пророк его возможно мог бы продаваться "лучше" винды. Как отдельный продукт. Ну естественно по другим ценам, но по 10 баксов за лицензию бессрочную на систему можно было бы за него платить. Ну а с виндой вроде как бесплатно бы шёл. Как это сделать вопрос второй. В принципе да, особых надежд не питаю. Если бы было бесплатно, то это скорее уже была бы java с её недостатками из-за отсутствия централизации.

    Видимо, открыл не до конца
    Windows & Office — это две cash cows компании. Наибольший доход от их продажи компания получает не из розничных продаж, а от всяких DELL/HP/ACER/etc., которые предустанавливают этих дойных коров на продаваемые компы.
    Отношение количества девелоперов в мире к количеству остальных юзеров, я думаю, даже не в сотни раз. Поэтому предустанавливать Visual Studio или даже .NET SDK на все компы смысла ноль — затраты не отобъёшь.
    Если компания сделает средство разработки многоплатформенным среди не своих платформ, то тем самым она своими собственными руками выпилит сук, на которых сидит — заложит основу для перевода пользователей на нругие платформы. И вот представьте: за средство разработки денег больших не поднять, а платформа больше не приносит того огромного бабла. А виноват в этом тот, кто решил "дать людЯм свободу, равенство и братство" в выборе платформы для разработки.
    Respectfully,
    Alexander Fedin.
    Re[7]: Что нужно добавить в C#?
    От: agat50  
    Дата: 16.03.13 10:27
    Оценка:
    Здравствуйте, alexanderfedin, Вы писали:

    A>Здравствуйте, agat50, Вы писали:


    A>>Здравствуйте, alexanderfedin, Вы писали:


    A>>>Зачем Майкрософту рубить сук, на котором он сидит?

    A>>>Компания зарабатывает деньги не на продаже .NET, а на продаже операционной системы Windows. .NET — это средство для облегчения создания программ под Windows сторонним производителям, а не способ облегчить перенос этих программ на другие платформы.
    A>>>Именно поэтому компания поддерживает платформу Mono ровно настолько, чтобы её не обвинили в монополизме, и ни на грамм больше.

    A>>Спасибо кэп, открыли глаза Момент в том, что dotnet и C# как пророк его возможно мог бы продаваться "лучше" винды. Как отдельный продукт. Ну естественно по другим ценам, но по 10 баксов за лицензию бессрочную на систему можно было бы за него платить. Ну а с виндой вроде как бесплатно бы шёл. Как это сделать вопрос второй. В принципе да, особых надежд не питаю. Если бы было бесплатно, то это скорее уже была бы java с её недостатками из-за отсутствия централизации.

    A>Видимо, открыл не до конца
    A>Windows & Office — это две cash cows компании. Наибольший доход от их продажи компания получает не из розничных продаж, а от всяких DELL/HP/ACER/etc., которые предустанавливают этих дойных коров на продаваемые компы.
    A>Отношение количества девелоперов в мире к количеству остальных юзеров, я думаю, даже не в сотни раз. Поэтому предустанавливать Visual Studio или даже .NET SDK на все компы смысла ноль — затраты не отобъёшь.
    A>Если компания сделает средство разработки многоплатформенным среди не своих платформ, то тем самым она своими собственными руками выпилит сук, на которых сидит — заложит основу для перевода пользователей на нругие платформы. И вот представьте: за средство разработки денег больших не поднять, а платформа больше не приносит того огромного бабла. А виноват в этом тот, кто решил "дать людЯм свободу, равенство и братство" в выборе платформы для разработки.


    Намёк понятен?

    Причём тут средство разработки, я не предлагаю сделать студию портируемой, только CLR с классами. Как и sql server, axapta, directx и т.п. Пусть они останутся привязаны к винде, нет вопросов. Но имхо dotnet весьма страдает как серверная платформа из-за ограничений этих, ну не могу я на 5 виртуалок винду лицензии поставить. Не говоря про отсутствие лёгких дистрибутивов винды типа ubuntu server. Вообще забейте, надо будет, с моно разберусь конечно.
    Re: Что нужно добавить в C#?
    От: Аноним  
    Дата: 01.04.13 11:31
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    Что бы можно было написать так.

     public static implicit operator IEnumerable<MyOperator<T>>(IEnumerable<T> src)
            {
                return src.Select(a => MyOperator<T>.Create(a));
            }

    и не получить
    User-defined conversion must convert to or from the enclosing type
    Re[2]: Что нужно добавить в C#?
    От: Аноним  
    Дата: 01.04.13 11:45
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>Здравствуйте, AndrewVK, Вы писали:


    А>Что бы можно было написать так.


    хотя бы внутри

    public class MyOperator<T>
        {
    Re[4]: Что нужно добавить в C#?
    От: koandrew Канада http://thingselectronic.blogspot.ca/
    Дата: 04.04.13 16:37
    Оценка:
    Здравствуйте, kaa.python, Вы писали:

    KP>Ну, это как сказать. С одной стороны да. С другой стороны, CLR — это в первую очередь C#, так же как JVM это в первую очередь Java. Они неразрывно связанны и обсуждение одного в отрыве от второго бессмысленно.


    Наличие Mono как бы намекает, что вы ерунду говорите
    [КУ] оккупировала армия.
    Re[10]: Что нужно добавить в C#?
    От: koandrew Канада http://thingselectronic.blogspot.ca/
    Дата: 04.04.13 17:01
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Бывают такие юнионы, которые содержат в себе флаг, указывающий в каком они состоянии.

    WH>Я такими каждый день пользуюсь.
    Это неправильные юнионы. Правильные — это по сути reinterpret_cast<> из C++.
    [КУ] оккупировала армия.
    Re[9]: В C# уже и так многое добавили
    От: koandrew Канада http://thingselectronic.blogspot.ca/
    Дата: 04.04.13 17:32
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Защита от вирусов.


    Странная какая-то защита. Просто запустить экзешник можно, а вот отngen'ить и потом результат запустить — нельзя...
    [КУ] оккупировала армия.
    Re[3]: Что нужно добавить в C#?
    От: koandrew Канада http://thingselectronic.blogspot.ca/
    Дата: 04.04.13 17:38
    Оценка:
    Здравствуйте, hardcase, Вы писали:

    H>Это возможно реализовать только с изменением рантайма, сам язык для поддержки интринзиков менять не нужно. В Mono такое сделали, но я даже не уверен что этим API кто-либо пользуется.

    Однозначно в рантайме. Иначе маршаллинг съест нафиг всё преимущество параллельного вычисления.
    [КУ] оккупировала армия.
    Re[10]: В C# уже и так многое добавили
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 05.04.13 08:48
    Оценка:
    Здравствуйте, koandrew, Вы писали:

    AVK>>Защита от вирусов.

    K>Странная какая-то защита. Просто запустить экзешник можно, а вот отngen'ить и потом результат запустить — нельзя...

    Просто ехешник это IL код, который при генерации нативного кода верифицируется. А вот кеш ngen при запуске уже никто не верифицирует.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[11]: В C# уже и так многое добавили
    От: koandrew Канада http://thingselectronic.blogspot.ca/
    Дата: 05.04.13 09:48
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Просто ехешник это IL код, который при генерации нативного кода верифицируется. А вот кеш ngen при запуске уже никто не верифицирует.


    Ngen же вроде верифицирует код...
    [КУ] оккупировала армия.
    Re: Что нужно добавить в C#?
    От: Аноним  
    Дата: 05.04.13 11:54
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам. Желательно раскрыть мысль поподробнее.

    ...

    исправить наконец компилятор и сделать using abort безопасными. что бы в случае остановки потока abort-ом ресурсы гарантированно освобождались.
     
    using(var res=CreateSomeResource()) {
      // сечас компилятор генерит такой код что возможно вызвать Abort для потока и ресурсу не будет вызван Dispose();
    }


    сделать префиксы по умолчанию что бы короче писать
    class A {
    static public [dllimport(.....)] [SomeAttr] ... {
      void fn1() {}
      void fn2() {}
    }
    или во
    #prefixregion static public [Attr1] [Attr2] ...
    ...
    #endregion
    }


    из тойже оперы. чтобы можно было не уразывать каждый раз название enum
    enum Bits { B0=1,B1=2,B2=4,B3=8 };
    ...
    int r1=(int)( Bits.B0 | Bits.B1 | Bits.B2 | Bits.B3);
    int r2=(int) using(Bits) B0|B1|B2;
    ...
    void fn(Bits bits) {...}
    ...
    fn(using(Bits) B0|B1|B2|B3);
    или чтоб по умолчанию так было
    fn( B0|B1|B2|B3 );


    задание поведения при невозможности вычисления выражения (не только null exception но и например пропускать код)
    по принципу isset из php: isset( $a[1][2][3][4][5][6][7][8] )
      Action a1;
      if (a1!=null) a1();
    
      Action<string> trace
      if (trace!=null) trace( prepare_string_for_trace() );
    
      if (a!=null && a.b!=null && a.b.c!=null && a.b.c.d!=null) a.b.c.d( retrive_some_args() );
    
      // что бы было примерно так
      call a1();
      call trace( prepare_string_for_trace );
      call a.b.c.d( retrive_some_args() );


    подстановка кода например
      bool enable=true;
      after_each_line(enable, source_file => trace( "{0}:{1}", source_file.Name, source_file.Line ), ()=> {
         fn1();
         fn2();
         fn3();
         fn4();
      });
      ...
      bool enable=true;
      Action<SourceFile> fn=!enable ? null : source_file => trace( "{0}:{1}", source_file.Name, source_file.Line);
      fn1(); if (fn!=null) fn(new SourceFile() { Name="src.cs", Line=100, ... });
      fn2(); if (fn!=null) fn(new SourceFile() { Name="src.cs", Line=101, ... });
      fn3(); if (fn!=null) fn(new SourceFile() { Name="src.cs", Line=102, ... });
      fn4(); if (fn!=null) fn(new SourceFile() { Name="src.cs", Line=103, ... });


    сделать обытия для свойств помимо get_ set_ методов еще event_ событие было по изменению
    ...
    public int value=5 { get;set;modify; }
    ...
    value.modify+=()=>{ ... };
    или так
    onchange(value)+=()=> {...};


    иногда хочется вот такой вот порнографии
    for(int a=0;i<N;++a) {
    case first: {}
    case last: {}
    case odd: {}
    case even: {}
    case enter: {}
    case leave: {}
    case if (a%3==2) {}
    // every step
    }
    ...
    foreach(var it in list) {
    case first: {}
    case last: {}
    case odd: {}
    case even: {}
    case enter: {}
    case leave: {}
    case if (cond(it)) {}
    // ordinary
    }


    Не хватает такого синтаксиса в определения методов класса
    class A {
       public event void dyn_fn(object prm) { ... }
    }
    ...
    class A {
       Action<object> dyn_fn=dyn_fn_default;
       void dyn_fn_default(object prm) { ... }
    }


    Дозадание функций (регулярных выражений не прошу)
    class A {
      void fn(int x) switch;
      void fn(int x) case x=0 { ... }
      void fn(int x) case (x>10 && x<100) { ... }
      void fn(int x) case default { ... }
    }
    class B : public A {
      void fn(int x) case (x>200 && x<214) { ... }
    }


    Динамический switch
       class A {
         public switch cases;
         void fn(int cmd) {
            switch(cases(cmd)) {
              case 0: { ... } break;
              case 1: { ... } break;
              default: { ... } break;
            }
         }
       }
       class B : public A {
         void fn(int cmd) {
            switch(cases(cmd)) {
              case 2: { ... } break;
              case 3: { ... } break;
            }
         }
       }
       ...
       var b=new B();
       b.cases.add(4, cmd=> { ... });
       b.cases.add(5, cmd=> { ... });


    Очень не хватает контекста для функций и свойств
       class A {
         public static void fn(string msg) { var ctx=ThreadContext::GetCurrentThreadContext(); var recorder=ctx.Resolve<IRecorder>();  recorder.Record(msg); }
         int x;
         public int X { 
           get { 
             #if AUTOMATIC_DEBUG
             var ctx=ThreadContext::GetCurrentThreadContext(); var bp=ctx.Resolve<IBreakPoints>(); 
             bp.NotifyReadAccess(this,"A.get_X",x)
             #endif
             return x; 
           } 
           set { 
             #if AUTOMATIC_DEBUG
             var ctx=ThreadContext::GetCurrentThreadContext(); var bp=ctx.Resolve<IBreakPoints>(); 
             bp.NotifyWriteAccess(this,"A.set_X",value);
             #endif
             x=value;
           }
       }


    Не хватает простой авто генерации кода
      interface A {
        void f1(int x,int y);
        string f2(int x,int y,param object[] args);
        int X { get;set; }
        ...
      }
      class AWrapper : public A() {
        public A a;
        public void f1(int x,int y) { a.f1(x,y); }
        public string f2(int x,int y,param object[] args) { return a.f2(x,y,args); };
        public int X { get { return a.X; } set { a.X=value; } }
        ...
      }

    Вобщем нехватает макросов как так чтоб можно было генерить исходный текст параметрически.
    Re[12]: В C# уже и так многое добавили
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 05.04.13 14:01
    Оценка:
    Здравствуйте, koandrew, Вы писали:

    K>Ngen же вроде верифицирует код...


    Ngen то верифицирует, но результат потом сохраняет на диске. И если потом неадмину этот результат позволено будет подправить, то потом, при запуске сборки в том числе и из под админских привелегий можно будет подсунуть собственный код. Поэтому модификация кеша ngen должна быть строго с админскими привилегиями.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 66 on Windows 8 6.2.9200.0>>
    AVK Blog
    Re[7]: Что нужно добавить в C#?
    От: matumba  
    Дата: 05.04.13 20:44
    Оценка:
    Здравствуйте, alexanderfedin, Вы писали:

    A>Если компания сделает средство разработки многоплатформенным среди не своих платформ, то тем самым она своими собственными руками выпилит сук, на которых сидит


    Не совсем всё так однозначно. Сейчас вот что мы имеем? Сидит какой-нть прыщавый виндо-хэйтер и решает — и винда вроде нужна, и сишарпить под ней можно, но внутренний кретин голос говорит — "а мы уйдём на север!". Причём полностью уйдём — на линупс+пестон, например. И получается, что вместо придержания "многоплатформенного" хэйтера, который мог бы делать софт ДЛЯ ОБЕИХ платформ, мелкософт ПОЛНОСТЬЮ теряет отдельного специалиста!
    Когда выбор "или-или" — теряют все. Просто дебилам в руководстве проще изображать из себя властелина платформы, чем думать мозгами и грести бабло экскаваторами. А с планшетно-мобильной волной вообще вымывает все стойки под виндоофисом: если раньше выбор был "мак или вынь" (причём сильно в пользу последней), то сейчас уже задумываются "а нужен ли мне десктопный виндовоз вообще?".
    Re: Что нужно добавить в C#?
    От: Didi  
    Дата: 06.04.13 06:50
    Оценка: 2 (2) +1
    Наконец, хотя этот предмет не из приятных, я должен упомянуть PL/1, язык программирования, документация которого обладает устрашающими размерами и сложностью. Использование PL/1 больше всего напоминает полет на самолете с 7000 кнопок, переключателей и рычагов в кабине. Я совершенно не представляю себе, как мы можем удерживать растущие программы в голове, когда из-за своей полнейшей вычурности язык программирования — наш основной инструмент, не так ли! — ускользает из-под контроля нашего интеллекта. И если мне понадобится описать влияние, которое PL/1 может оказывать на своих пользователей, ближайшее сравнение, которое приходит мне в голову, — это наркотик. Я помню лекцию в защиту PL/1, прочитанную на симпозиуме по языкам программирования высокого уровня человеком, который представился одним из его преданных пользователей. Но после похвал в адрес PL/1 в течение часа он умудрился попросить добавить к нему около пятидесяти новых «возможностей», не предполагая, что главный источник его проблем кроется в том, что в нем уже и так слишком уж много «возможностей». Выступающий продемонстрировал все неутешительные признаки пагубной привычки, сводящейся к тому, что он впал в состояние умственного застоя и может теперь только просить еще, еще, еще... Если FORTRAN называют детским расстройством, то PL/1, с его тенденциями роста подобно опасной опухоли, может оказаться смертельной болезнью.
    Смиренный программист (EWD340) Эдсгер Дейкстра 1972г.

    Ничего не напоминает? Действительно, история развивается по спирали...
    Re: Что нужно добавить в C#?
    От: Аноним  
    Дата: 06.04.13 09:10
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Соответственно, от вас хотелось бы получить те фичи, которых не хватает лично вам.


    конструкцию assume такого вида:
      int ret=0;
      assume (res>0) or throw new Exception(GetErrorMessage(res)) {
         ret=DoOp1();
         ret=DoOp2();
         ret=DoOp3();
      }
      ...
      Action<string> action=null;
      ...
      assume (action!=null) or skip {
         ...
         action("some message");
         ...
         action("some message");
         ...
      }
      assume possible or skip {
         a.b.c.d.e.f=1; // проверять возможно ли выполнить такое действие если да то выполнить и ничего не делать если не возможно например a.b.c.d=null
      }
      assume no return {
         ...
         return 1; // ошибку компиляции если встретился return
         ...
      }
      object a=...;
      assume a is Control or skip {
        a.Name="name";
      }
      ...

    Просто что бы внутри блока проверяло условие перед использованием или при изменении значения переменной(ых) и выполняло заданное действие.

    Что бы не писать так:
      int res=0;
      {
         ret=DoOp1(); if (!(res>0)) throw new Exception(GetErrorMessage(res));
         ret=DoOp2(); if (!(res>0)) throw new Exception(GetErrorMessage(res));
         ret=DoOp3(); if (!(res>0)) throw new Exception(GetErrorMessage(res));
      }
      Action<string> action=null;
      ...
      {
        if (action!=null) action("some message");
        ... 
        if (action!=null) action("some message");
        ...
      }
      // no return - на уровне компилятора (чтоб рефакторить длиныые портянки if-ов или switch-ей)
      {
         if (a!=null && a.b!=null && a.b.c!=null && a.b.c.d!=null && a.b.c.d.e!=null) a.b.c.d.e.f=1;
         // try { a.b.c.d.e.f=1; } catch {}
      }
    
      object a=...;
      if (a is Control) { Control local_a=(Control)a;
        local_a.Name="name";
      }


    Хотелось бы вложенных функций
       void Foo(int x) {
         int Bar(int a) { ... }
         Bar(x);
       }
       // а не только так
       void Foo(int x) {
         Func<int,int> Bar=(a)=>{ ... };
         Bar(x);
       }
    Re[2]: Что нужно добавить в C#?
    От: IT Россия linq2db.com
    Дата: 06.04.13 16:48
    Оценка: +1
    Здравствуйте, Didi, Вы писали:

    D>Ничего не напоминает? Действительно, история развивается по спирали...


    Не напоминает. Фичи фичам рознь. Например, в том же PL/1 для того, чтобы сделать возможность вызывать функцию рекурсивно, нужно было помечать её особым ключевым словом. Вот такие там в основном были фичи. Ничего общего с тем что здесь обсуждается.
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[3]: Что нужно добавить в C#?
    От: AlexRK  
    Дата: 06.04.13 17:13
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>Здравствуйте, Didi, Вы писали:


    D>>Ничего не напоминает? Действительно, история развивается по спирали...


    IT>Не напоминает. Фичи фичам рознь. Например, в том же PL/1 для того, чтобы сделать возможность вызывать функцию рекурсивно, нужно было помечать её особым ключевым словом. Вот такие там в основном были фичи. Ничего общего с тем что здесь обсуждается.


    Ну, в C# тоже достаточно революционных фич а-ля partial methods.
    Re[4]: Что нужно добавить в C#?
    От: IT Россия linq2db.com
    Дата: 06.04.13 17:21
    Оценка:
    Здравствуйте, AlexRK, Вы писали:

    IT>>Не напоминает. Фичи фичам рознь. Например, в том же PL/1 для того, чтобы сделать возможность вызывать функцию рекурсивно, нужно было помечать её особым ключевым словом. Вот такие там в основном были фичи. Ничего общего с тем что здесь обсуждается.


    ARK>Ну, в C# тоже достаточно революционных фич а-ля partial methods.


    Весьма полезная штукенция, если речь идёт о генерации кода. При наличии полноценного МП, конечно, рудимент, но до полноценного МП нам ещё как до Парижу.
    ... << RSDN@Home 1.2.0 alpha 5 rev. 69>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[2]: Что нужно добавить в C#?
    От: Andir Россия
    Дата: 07.04.13 07:47
    Оценка:
    Здравствуйте, koodeer, Вы писали:

    K>Хотелось бы иметь ограничение дженериков как простых типов, чтобы можно было реализовывать быстрые вычисления.

    В эту же кучу ограничение дженериков на параметризованный конструктор типа.

    --
    С Уважением, Andir!
    using(<< RSDN@Home 1.2.0 alpha 5 rev. 67>>) { /* Работаем */ }
    Re[3]: Что нужно добавить в C#?
    От: Ilya81  
    Дата: 08.04.13 14:00
    Оценка:
    Здравствуйте, Andir, Вы писали:

    A>Здравствуйте, koodeer, Вы писали:


    K>>Хотелось бы иметь ограничение дженериков как простых типов, чтобы можно было реализовывать быстрые вычисления.

    A>В эту же кучу ограничение дженериков на параметризованный конструктор типа.

    A>--

    A>С Уважением, Andir!
    Вот это точно! А ещё ограничение на отсутсвие управляемых указателей, чтоб можно было писать
    T* pT1= (T*)Marshal.AllocHGlobal(n*Marshal.SizeOf(typeof(T)));



    А самое желательное, то что вообще-то есть, но не в пользовательской версии, а в Singularity — восклицательные знаки для запрета пустых указателей.
    Re: Что нужно добавить в C#?
    От: pavel783  
    Дата: 10.04.13 06:19
    Оценка:
    чего не хватает так это множественного наследования, просто за основу программирования взята математическая модель с ее иерархическими цепочками от частного к общему, с другой стороны должны же когдато предоставить возможность множественного кроссовера как например делается с растениями или в генетическом алгоритме — это был бы прорыв
    Re[2]: Что нужно добавить в C#?
    От: Аноним  
    Дата: 10.04.13 07:50
    Оценка:
    Здравствуйте, pavel783, Вы писали:

    P>чего не хватает так это множественного наследования, просто за основу программирования взята математическая модель с ее иерархическими цепочками от частного к общему, с другой стороны должны же когдато предоставить возможность множественного кроссовера как например делается с растениями или в генетическом алгоритме — это был бы прорыв


    Я против
    Re[3]: Что нужно добавить в C#?
    От: samius Япония http://sams-tricks.blogspot.com
    Дата: 10.04.13 07:51
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>Здравствуйте, pavel783, Вы писали:


    P>>чего не хватает так это множественного наследования


    А>Я против

    Не беспокойтесь, изменениями в C# этот вопрос не решить. Тут нужно рантайм менять.
    Re[2]: Что нужно добавить в C#?
    От: Codechanger Россия  
    Дата: 10.04.13 09:45
    Оценка: +2
    Здравствуйте, pavel783, Вы писали:

    P>чего не хватает так это множественного наследования, просто за основу программирования взята математическая модель с ее иерархическими цепочками от частного к общему, с другой стороны должны же когдато предоставить возможность множественного кроссовера как например делается с растениями или в генетическом алгоритме — это был бы прорыв


    Это уже проходили в С++. При среднем уровне программиста вреда от множественного наследования больше, чем пользы, да и ногу отстрелить себе значительно легче. За 10 лет программирования на .Net как-то не возникало задачи, требующей множественное наследование.
    Re[2]: Что нужно добавить в C#?
    От: Flammable Россия  
    Дата: 11.04.13 06:40
    Оценка:
    Здравствуйте, pavel783, Вы писали:
    P> возможность множественного кроссовера как например делается с растениями или в генетическом алгоритме — это был бы прорыв
    Кроссинговера, наверное. А вообще, как уже написали — не нужно.
    Re: Что нужно добавить в C#?
    От: Аноним  
    Дата: 12.04.13 14:11
    Оценка:
    Автоматические свойства, с возможностью изменения только из конструктора.

    int Property { get; initonly set; }
    Re[2]: Что нужно добавить в C#?
    От: hardcase Пират http://nemerle.org
    Дата: 12.04.13 18:00
    Оценка: +4
    Здравствуйте, Аноним, Вы писали:

    А>Автоматические свойства, с возможностью изменения только из конструктора.


    А>
    А>int Property { get; initonly set; }
    А>


    Два слова тут лишние: initonly и set. Именно так сделано в Nemerle.
    /* иЗвиНите зА неРовнЫй поЧерК */
    Re: Что нужно добавить в C#?
    От: Silver_S Ниоткуда  
    Дата: 23.04.13 10:23
    Оценка:
    Как-то автоматизировать написание wrapper. Хотя синтаксис будет кривоватый, какой ни придумывай, но хоть что нибудь. Иногда нужно.
    Например так:

    class C
    {
      private Cl2 _member;
      ...
      wrappers(_member)
      {
         int Prop1{get;set;}
         int Func1(int p1, ref int p2);
         ...
      }
    }

    В фигурных скобках декларация членов как в описании интерфейса (может с модификаторами доступа public protected private), эти члены появляются в классе, реализуются как обертки над членами _member.
    Т.е раскрываются в такое

    class C
    {
      private Cl2 _member;
      public Prop1{ get{return _member.Prop1;} set{_member.Prop1=value;} }
      public int Func1(int p1, ref int p2){ return member.Func1(p1, ref p2); }
      ...
    }
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.