Здравствуйте, ie, Вы писали:
IT>>Конечно, лучше выдавать вменяемые ошибки. ie>+100, а то эти невменяемые отмазки компилятора уже напрягают.
Ну так займись Там поле не паханное. Всё равно с такой диагностикой ошибок как сейчас в релиз пускать компилятор рановато.
IT>>А ещё лучше, сделать самому приведение, если это возможно. ie>Хмм. Какими правилами руководствоваться? Implicit и UpCast?
Я бы начал с рассмотрения частных случаев. Преобразование 5 к int? логично? Значит надо преобразовывать. И т.д.
Если нам не помогут, то мы тоже никого не пощадим.
ie>>int? p = null;
ie>>int? q = null;
ie>>if (p ?? q == 0); // тут мне 0 нафиг не нужен
ie>>
VD>Я незнаю что тебе "тут" не нужно. Но такой оператор не нужен никому. В нем просто нет смысла.
Смысл можно найти во всем, но то что такой случай редкость, спорить не буду.
VD>А вот где в спецификации C# такое написано мне было бы интересно поглядеть. Тыкни, плиз пальцем. Или процитируй.
The type of the expression a ?? b depends on which implicit conversions are available between the types
of the operands. In order of preference, the type of a ?? b is A0, A, or B, where A is the type of a, B is the
type of b, and A0 is the type that results from removing the trailing ? modifier, if any, from A. Specifically,
a ?? b is processed as follows:
• If A is not a nullable type or a reference type, a compile-time error occurs. • If A is a nullable type and an implicit conversion exists from b to A0, the result type is A0. At run-time, a
is first evaluated. If a is not null, a is unwrapped to type A0, and this becomes the result. Otherwise, b is
evaluated and converted to type A0, and this becomes the result.
• Otherwise, if an implicit conversion exists from b to A, the result type is A. At run-time, a is first
evaluated. If a is not null, a becomes the result. Otherwise, b is evaluated and converted to type A, and
this becomes the result.
• Otherwise, if an implicit conversion exists from A0 to B, the result type is B. At run-time, a is first
evaluated. If a is not null, a is unwrapped to type A0 (unless A and A0 are the same type) and converted
to type B, and this becomes the result. Otherwise, b is evaluated and becomes the result.
Otherwise, a and b are incompatible, and a compile-time error occurs.
Т.е. если оператор применяется к 2-м nullable, то результатом всегда будет nullable.
VD>А пока вот простенький тестик на C# 2.0: VD>
Дык, тут как раз попадаем под 2-ой пункт, где B приводимо к A0, т.к. A == int?, A0 == int, B == int.
VD>Что-то мне не веритися, что в МС реализовали эту фичу не по спецификации.
Здравствуйте, VladD2, Вы писали:
IT>>Нормальные задачи, например, отложенная инициализация свойст недефолтными значениями.
VD>Это у тебя что свойство будет на ходу тип менять?
Это как У нас же статически типизированный язык. Недефолтное значит, что string может равняться не string.Empty, а "something else".
VD>Единственное применение это: VD>
VD>def x : int? = null;
VD>def x ::= 2;
VD>
VD>что по-моему совершенно не очевидно и даже нелепо. В общем, я против такого.
Против такого я тоже против
Если нам не помогут, то мы тоже никого не пощадим.
IT>Или вот, например, NemerleProjectNode, line 137-145:
IT>
IT>protected internal VSLangProj.VSProject VSProject
IT>{
IT> get { _vsProject ??= new OAVSProject(this); }
IT>}
IT>
IT>По-моему, более чем понятно что здесь происходит.
Мне это решительно не нравится. Такое "сокращение" резко усложнит понимание. Оно не интуитивно. И практически ничего не дает. Так как таких пест впрограмме не много. Если тебе уж хочется автоматизировать подобные вещи, то лучше создай просто фукнцию типа:
AutoInit[T](var : ref T, creator : void) : T
where T: class
{
when (var == null)
var = creator();
var;
}
тогда хотя бы будет понятно что присходит и не будет лишней сущьности.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, IT, Вы писали:
IT>А ?? не путает? Боюсь, что не путает только потому, что это уже есть в C#.
?? интуитивно понятен и не создает странного побочного эффекта. В общем, я все болше и больше против такого расширения. Это идея от избытка возможностей. Совершенно лишняя, по-моему.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ie, Вы писали:
ie>Смысл можно найти во всем, но то что такой случай редкость, спорить не буду.
Ну, так поясни мне его. А то я его не вижу в упор. Если речь идет не о nullable-типах, а о ссылочных, то это другое дело. Ты все равно это как частный случай обрабатываешь.
ie>Да нет, сам проверял, все по спецификации.
С Some() у тебя точно ерунда выходит, так как из него точно никаких неявных приведений типов нет. Так что это по любому ошибка.
В отношении nullable-типов что-то я пока торможу. Может ты и прав. Надо не спросони еще раз проанализировать.
Так что по крайней мере разберись с Some(x)/None().
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Мне это решительно не нравится. Такое "сокращение" резко усложнит понимание. Оно не интуитивно. И практически ничего не дает.
А '??' тебе нравится? Такое сокращение не резко усложняет понимание? Оно интуитивно? Практически что-то делает?
Боюсь, что у этого сокращения есть только один плюс — оно уже в C#, поэтому включение аналога в N не вызывает такого негодования. Стоило предложить, все покивали головами и тут же побежали его делать. '??=' при наличии '??' — это уже не так страшно, поверь мне. Если понимать, что такое первые два '??', то '=' проблем уже не вызывает. Впрочем, мне всё равно, но на реакцию, основанную исключительно на личных предпочтениях, посмотреть было забавно
VD>Так как таких пест впрограмме не много.
Ты их все сосчитал? Только в своём коде? Осталось только добавить, что это вообще плохой паттерн, назвать его бредом и заклеймить всех, кто его использует
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, VladD2, Вы писали:
IT>>А ?? не путает? Боюсь, что не путает только потому, что это уже есть в C#.
VD>?? интуитивно понятен
Нифига он не понятен. Ставил эксперименты над несколькими людьми. Ни один человек сходу интуитивно не понял. Ни один!
VD>и не создает странного побочного эффекта.
Как насчёт: '::=', '&=', '|=' и даже '='? Они тоже создают странные побочные эффекты?
VD>В общем, я все болше и больше против такого расширения. Это идея от избытка возможностей. Совершенно лишняя, по-моему.
Да ради бога, я и не настаиваю. Смешно только смотреть, как странные фичи от MS воспринимаются с открытым ртом, а такие же по странности, но другие отвергаются с негодованием. Если уж на то пошло, то хотя я и предложил добавить '??' в N, но шедевром этот оператор не считаю. А уж в N без короткого if — ?:, он вовсе нелогичен и ему там вообще делать нечего.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, VladD2, Вы писали:
ie>>Смысл можно найти во всем, но то что такой случай редкость, спорить не буду.
VD>Ну, так поясни мне его. А то я его не вижу в упор. Если речь идет не о nullable-типах, а о ссылочных, то это другое дело. Ты все равно это как частный случай обрабатываешь.
Например такой:
def GetValue(p) : int?
{
// возвращаем зависимое от p значение
}
...
...
foreach (i in $[1..20])
res = res ?? GetValue(i); // мож сделать оператор '=??' в догонку к '??' и '??=' ? :)))
Ситуация конечно надуманная, но я не исключаю возможности ее возникновения. Аналогично с option.
VD>С Some() у тебя точно ерунда выходит, так как из него точно никаких неявных приведений типов нет. Так что это по любому ошибка.
Дык, из nullable тоже нет никаких неявных приведений.
VD>Так что по крайней мере разберись с Some(x)/None().
Я бы разобрался, но тоже не могу понять как правильно то надо?
Не зависимо от того является ли второй операнд option, возвращать Value? — А что тогда делать если оба None?
Здравствуйте, IT, Вы писали:
IT>>>А ?? не путает? Боюсь, что не путает только потому, что это уже есть в C#. VD>>?? интуитивно понятен IT> IT>Нифига он не понятен. Ставил эксперименты над несколькими людьми. Ни один человек сходу интуитивно не понял. Ни один!
Какого плана экспиримент? Только что спросил джависта, то ли у них там в джаве что-то похожее есть, но со второй попытки угадал. (Первая была: "какой-то муд@к полез ставить && в русской раскладке" )
VD>>В общем, я все болше и больше против такого расширения. Это идея от избытка возможностей. Совершенно лишняя, по-моему. IT>Да ради бога, я и не настаиваю. Смешно только смотреть, как странные фичи от MS воспринимаются с открытым ртом, а такие же по странности, но другие отвергаются с негодованием. Если уж на то пошло, то хотя я и предложил добавить '??' в N, но шедевром этот оператор не считаю. А уж в N без короткого if — ?:, он вовсе нелогичен и ему там вообще делать нечего.
Здравствуйте, IT, Вы писали:
ie>>Эээ, а причем тут кототкий if? IT>При том, что ?? — это расширение оператора ?:, которого в N нет, т.е. пропущен один шаг эволюции