Здравствуйте, VladD2, Вы писали:
AVK>>1) Неявно типизированные локальные переменные (implicitly typed local variable). То о чем долго говорили большевики в форуме философия. Даже ключевое слово народ там угадал.
VD>Ха! Большивики еще говорили о том, что разумно было бы ввести неизменяемые локальные переменне.
Это из другой оперы. Большевики еще, к примеру, очень долго говорили, что одним из самых больших недостатков императивных возможностей шарпа является отсутствие возможности подключения реализаций. Тем не менее воз и ныне там.
VD>А вообще, МС как всегда реализует чужие идеи называя их своими инменами. Это дело в исходном виде называлось "вывод типов" (type inference).
Вот бы еще они mixins скоммунизьмили.
VD>Вот и ответ на все несоотвестия. Таки теперь мы будет иметь нормальный ОО-синтаксис вызова методов расширения. В общем, объект все что качается, если не качается, то раскачивается и признается объектом.
Ну, надо признать, что в Delphi.NET похожее уже есть.
AVK>>Сахар конечно, но забавно.
VD>Э... Не скажи. Это очень правильное решение. Это устраняет одно из серьезных несоотвествий. Теперь никакой педант не скажет, что ToString() ошибка, так как нельзя сделать ToMyClass().
VD>Единообразие много стоит.
ХЗ. ИМХО вопрос культуры программирования. С точки зрения архитектурных проблем это ничего не дает. А меня это волнует в первую очередь.
AVK>>Обсуждается необходимость расширяющих свойств, событий и операторов, но пока такое не поддержвается.
VD>Логично было бы позволить добавлять любые типы членов кроме пожалуй перменных.
Возможно, как с дженерик-свойствами, есть какие то синтаксические проблемы. Т.е. для методов добавление модификатора к параметру естественно, а вот со свойствами и событиями уже не так очевидно и требует сурового перетряхания грамматики. А вот почему операторы не добавили — ХЗ.
AVK>>3) Лямбда-выражения. Выражения, служащие для написания программ в функциональном стиле. Вобщем то в 2.0 анонимные методы очень на это похожи, но в 3.0 сделана попытка преобразовать внешний вид к более функциональному стилю. Для этого введен новый токен — =>.
AVK>>Пример:
AVK>>AVK>>delegate R Func<A,R>(A arg);
AVK>>...
AVK>>Func<int,int> f1 = x => x + 1; // Ok
AVK>>Func<int,double> f2 = x => x + 1; // Ok
AVK>>Func<double,int> f3 = x => x + 1; // Error
AVK>>
VD>То есть это только сахар?
Все, что сейчас описано это сахар, потому что существующая реализация работает на 2 фреймворке.
VD> Хотя конечно и это полезно. Уж больно много места занимает никчемное ключевое слово delegate и описание параметров анонимного метода.
+1
VD>Однако для полноценного применения функционального стиля нужно сделать еще два шага. Во первых ввести передачу лямд без делегатов, чтобы можно было делать лямбда-преоразования и соответсвенно строить методы из кусков,
Возможно можно будет что то соорудить на базе expression tree.
AVK>> Хотя возможность творить на этой базе извраты (особенно если совместно с дженериками) меня пугает.
VD>Гы. Не боись. У функционального стиля большой потенциал. А ламерам останется Васик.
Не факт

. В нем тоже может многое из этого появится. Надо глядеть. Да и потом — для любителей извратов есть С++/CLI
VD>Ё! И об этом говорили большивеки в "Философии".
Как то прошло мимо моего глаза.
VD>Гы. Это же они и есть — tuple-ы.
VD>Так что предыдущий пример должен будет выглядеть так:
VD>VD>var dict = new Dictionary<string, int>
VD>{
VD> new { "one", 1 }, new { "two", 2 }, new { "three", 3 }
VD>};
VD>
Не, это работать не будет. Во-первых это просто неверный синтаксис, правильно так:
var dict2 = new Dictionary<string, int>
{
new { Key = "one", Value = 1 },
new { Key = "two", Value = 2 },
new { Key = "three", Value = 3 }
};
Потом, компилятор создаст свой класс, а в collection initializer нужно тот тип, который T в реализованном ICollection<T>. Т.е., в случае Dictionary это KeyValuePair. Текущий компилятор на такой код говорит следующее:
TupleDic.cs(15,9): error CS0029: Cannot implicitly convert type 'Test.<Projection>f__0' to 'System.Collections.Generic.KeyValuePair<string,int>'
Да, еще компилятор не понимает явную реализацию интерфейсов, так что даже мой вариант не компилируется, говорит что:
TupleDic.cs(7,42): error CS1501: No overload for method 'Add' takes '1' arguments
Хотя в спецификации написано, то он будет искать Add именно у ICollection<T> (и иногда так и делает, судя по предыдущей ошибке). ИМХО просто баг.
VD>А с чего он взял, что Name и Price — это свойства, а не поля?
С того, что так написано в спецификации.
VD>Не. Ты точно не правильно понял. Анонимные типы == кортежи. Кортежи сравниваются по значению и должны мочь использоваться везде где применимы длругие типы. Но должен быть синтаксис описания анонимных типов без декларации. Тогда их можно будет использовать как возвращаемые занчения функций и как параметры функций. Корче это неотемлемая часть функционального стиля!
Может быть. Но если ты приведешь компилируемый пример, тогда я поверю. Пока же, по текущей спецификации, это не работает. Единственное — компилятор на одинаковые объявления генерирует один и тот же класс. Это видно в самой последней строчке примера.
AVK>>ИМХО изврат редкостный. Насколько это будет полезно я пока ответить затрудняюсь.
VD>...хотя очень уж смахивает на list comprehension из таких языков как Питон, Хаскель и т.п. Вообще штука забавная, но уж больно диковинно реализованно. Хотя я могу ошибаться. Тут нужно попробовать на практике.
ИМХО слишком узкоспециализированно.
VD>Гы. Темнота. Это такой изращенческий способ открыть дверь в мир лямбда-исчислений, а точнее лямбда-конверсий, т.е. в мир комбинаторной логики. Дело в том, что делегаты далеко не самый эффективный способ работы с функциями. Они приводят к динамическому полиморфизму, что как минимум медленее нежели статический. Теория лямбда-конверсий подразумевает, что над методами можно производить разные вычисления какбудто это объекты. Таким образом можно из одних методов создавать другие. Причем результат может быть очень и очень забавным.
Но из текущей спецификации ничего такого не видно.
VD>Про операциями над этими выражениями ничего не сказано?
Нет. Там почти ничего не рассказано про эту фишку.
... << RSDN@Home 1.2.0 alpha rev. 617>>