Сравнение с Nullable
От: _nn_ www.nemerleweb.com
Дата: 29.11.10 13:07
Оценка:
Main() : void
{
  def p : int? = 20;
  when (p != 20 :> int?)
    Console.WriteLine("A");
  when (p == 20 :> int?)
    Console.WriteLine("B");
  when (!(p == 20 :> int?))
    Console.WriteLine("C");
}


Вот код который получается при просмотре рефлектором

Debug:
private static void Main()
{
    int? p = 20;
    if (p == 20)
    {
        Console.WriteLine("A");
    }
    if (p == 20)
    {
        Console.WriteLine("B");
    }
    if (p != 20)
    {
        Console.WriteLine("C");
    }
}


Release:
private static void Main()
{
    int? p = 20;
    int? nullable = 20;
    if ((p.GetValueOrDefault() == nullable.GetValueOrDefault()) && (p.HasValue == nullable.HasValue))
    {
        Console.WriteLine("A");
    }
    nullable = 20;
    if ((p.GetValueOrDefault() == nullable.GetValueOrDefault()) && (p.HasValue == nullable.HasValue))
    {
        Console.WriteLine("B");
    }
    nullable = 20;
    if ((p.GetValueOrDefault() != nullable.GetValueOrDefault()) || (p.HasValue != nullable.HasValue))
    {
        Console.WriteLine("C");
    }
}


Несмотря на то, что указанно != значения сравниваются.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Сравнение с Nullable
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.11.10 13:41
Оценка:
Здравствуйте, _nn_, Вы писали:

Если уж пишешь сюда, то давал бы ссылку на описание в багтрекере.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Сравнение с Nullable
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.11.10 13:54
Оценка: 1 (1)
Здравствуйте, _nn_, Вы писали:


__>Несмотря на то, что указанно != значения сравниваются.


Это... Баг в Typer2.n строка 1228.

Баг в общем-то плевй. Но на его тестирование и т.п. нужно время. Доступ к SVN у тебя ведь есть?
Поправь, плиз, его сам и добавь тестов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Сравнение с Nullable
От: _nn_ www.nemerleweb.com
Дата: 29.11.10 14:45
Оценка:
Здравствуйте, VladD2, Вы писали:

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



__>>Несмотря на то, что указанно != значения сравниваются.


VD>Это... Баг в Typer2.n строка 1228.


Так быстро находить причину, я еще могу

VD>Баг в общем-то плевй. Но на его тестирование и т.п. нужно время. Доступ к SVN у тебя ведь есть?

VD>Поправь, плиз, его сам и добавь тестов.

Ну это само собой разумеется
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Сравнение с Nullable
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.11.10 15:08
Оценка:
Здравствуйте, _nn_, Вы писали:

VD>>Это... Баг в Typer2.n строка 1228.


__>Так быстро находить причину, я еще могу


Плохо работает поиск по файлам?

Все что я сделал — это произвел поиск строки "GetValueOrDefault" по .n-файлам. Далее просмотрел найденное и нашел где эта функция используется в квази-цитате.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Сравнение с Nullable
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.11.10 15:23
Оценка: +1
Здравствуйте, _nn_, Вы писали:

__>Ну это само собой разумеется


Поглядел комит... Мне кажется твоя реализация немного медленнее исходной, так как требует большего количества вызовов в некоторых случаях.

Плюс в ней дублируется код. Можно этого избежать если оператор подставлять через квази-цитату. Сделать это можно примерно так:
def op = if (eq) <[ $("==" : dyn) ]> else <[ $("!=" : dyn) ]>;
<[ $op($e1, $e2) ]>;
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Сравнение с Nullable
От: hardcase Пират http://nemerle.org
Дата: 29.11.10 15:26
Оценка:
Здравствуйте, VladD2, Вы писали:

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


__>>Ну это само собой разумеется


VD>Поглядел комит... Мне кажется твоя реализация немного медленнее исходной, так как требует большего количества вызовов в некоторых случаях.


Вообще-то код сравнения я предложил...
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Сравнение с Nullable
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.11.10 15:28
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Вообще-то код сравнения я предложил...


И?
"Киса, вы говорите загадками" (с) Ильф и Петорв "12 стульев".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Сравнение с Nullable
От: hardcase Пират http://nemerle.org
Дата: 30.11.10 12:09
Оценка:
Здравствуйте, VladD2, Вы писали:

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


H>>Вообще-то код сравнения я предложил...


VD>И?

VD>"Киса, вы говорите загадками" (с) Ильф и Петорв "12 стульев".

Да меня _NN_ по аське дернул.

А почему (рассматриваем для true) вот этот код
if (v1.GetValueOrDefault() == v2.GetValueOrDefault())
  v1.HasValue == v2.HasValue
else
  false


лучше чем такой:

if(v1.HasValue && v2.HasValue)
  v1.Value == v2.Value
else
  v1.HasValue == v2.HasValue



И что насчет такого?
if(v1.HasValue)
  if(v2.HasValue)
    v1.Value == v2.Value
  else
    false
else
  !v2.HasValue
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: Сравнение с Nullable
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.11.10 14:19
Оценка:
Здравствуйте, hardcase, Вы писали:

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


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


H>>>Вообще-то код сравнения я предложил...


VD>>И?

VD>>"Киса, вы говорите загадками" (с) Ильф и Петорв "12 стульев".

H>Да меня _NN_ по аське дернул.


H>А почему (рассматриваем для true) вот этот код

H>
H>if (v1.GetValueOrDefault() == v2.GetValueOrDefault())
H>  v1.HasValue == v2.HasValue
H>else
H>  false
H>


H>лучше чем такой:


H>
H>if(v1.HasValue && v2.HasValue)
H>  v1.Value == v2.Value
H>else
H>  v1.HasValue == v2.HasValue
H>


По двум причинам:
1. Меньше конечных действий делается.
2. Генерируется код анлогичный тому что C#-компилятор генерирует, что положительно отражается на декомпилятции кода рефлеткором.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Сравнение с Nullable
От: hardcase Пират http://nemerle.org
Дата: 30.11.10 14:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>По двум причинам:

VD>1. Меньше конечных действий делается.
VD>2. Генерируется код анлогичный тому что C#-компилятор генерирует, что положительно отражается на декомпилятции кода рефлеткором.

Спасибо. Уже разобрался. Я не знал что метод GetValueOrDefault() не делает вообще ничего, кроме возврата поля.
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.