Вопрос на собеседовании
От: bo99ard  
Дата: 08.06.13 18:18
Оценка: :)
Доброго времени суток,

задали такой вопрос:

class MyClass
{

public static bool operator== (MyClass left, MyClass right)
{
return left == right;
}

}

static bool Compare(MyClass o1, MyClass o2)
{
if(o1 == null)
return o2==null;
return o1 == o2;
}

Вопрос что делает этот код?

Правильный ответ: К счастью собеседователь рассказал что он уходи в бесконечную рекурсию т.к.
на строчке if(o1 == null) null приводится к типу MyClass и в теле оператора происходит тоже самое.

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

Мало того что не хватает перегруженного оператора != так и для потомка object так же необходимо перегрузить
методы:

public override int GetHashCode()
public override bool Equals(object o)

Мой окончательный вариант:

class MyClass
{
public override int GetHashCode()
{
return 100;
}

public override bool Equals(object o)
{
MyClass m = (MyClass)o;
if (this == m) return true;
else return false;
}

public static bool operator== (MyClass left, MyClass r)
{
return false;
}

public static bool operator !=(MyClass left, MyClass r)
{
return true;
}
}

Но он все равно отрабатывает корректно.

Может кто нибудь сказать в чем дело?
Re: Вопрос на собеседовании
От: ichensky Украина https://github.com/ichensky
Дата: 08.06.13 19:21
Оценка: +1
Здравствуйте, bo99ard, Вы писали:

B>Может кто нибудь сказать в чем дело?


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

 public static bool operator != (MyClass left, MyClass right)
        {
            return ...;
        }



Если этот метод добавить, рекурсия будет происходить вот здесь:

  public static bool operator  == (MyClass left, MyClass right)
        {      
            return left == right; // вызов этой же функции(бесконечная рекурсия), т.к. мы перегрузили этот оператор.
        }
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: Вопрос на собеседовании
От: TK Лес кывт.рф
Дата: 09.06.13 11:12
Оценка: +1
Здравствуйте, bo99ard, Вы писали:

B>Доброго времени суток,


B>задали такой вопрос:

B>Вопрос что делает этот код?

Не надо думать что он делает — его сразу переписывать надо.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Вопрос на собеседовании
От: bo99ard  
Дата: 09.06.13 11:39
Оценка:
Здравствуйте, ichensky, Вы писали:

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


B>>Может кто нибудь сказать в чем дело?


I>В принципе, что бы код скомпилировался достаточно добавить метод,


т.к. что вас развели код не должен даже запускаться:

I>
I> public static bool operator != (MyClass left, MyClass right)
I>        {
I>            return ...;
I>        }
I>



I>Если этот метод добавить,


Он есть в окончательном варианте.

рекурсия будет происходить вот здесь:

I>
I>  public static bool operator  == (MyClass left, MyClass right)
I>        {      
I>            return left == right; // вызов этой же функции(бесконечная рекурсия), т.к. мы перегрузили этот оператор.
I>        }
I>


Об этом и речь, получилось на реальном примере воспроизвести рекурсию. У меня нет

Предоставьте, пожалуйста, рабочий пример в студию.
Re[3]: Вопрос на собеседовании
От: ichensky Украина https://github.com/ichensky
Дата: 09.06.13 13:54
Оценка:
Здравствуйте, bo99ard, Вы писали:

B>Об этом и речь, получилось на реальном примере воспроизвести рекурсию. У меня нет


B>Предоставьте, пожалуйста, рабочий пример в студию.


Поставь на каждую строчку этой функции точку останова в дебагере.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[3]: Вопрос на собеседовании
От: Sinix  
Дата: 10.06.13 05:18
Оценка: -1
Здравствуйте, bo99ard, Вы писали:

B>Об этом и речь, получилось на реальном примере воспроизвести рекурсию. У меня нет

x64? При определённых условиях JIT может превратить вызов в хвостовую рекурсию, ваш случай подходит. Укажите целевую платформу x86 — должно "помочь"
Re[4]: Вопрос на собеседовании
От: Sinix  
Дата: 10.06.13 09:32
Оценка:
Здравствуйте, Sinix, Вы писали:

S>x64?

Эмм, drol, а с чем ты не согласен? Я ведь перепроверил перед тем как писать. Воспроизводится.
Re[5]: Вопрос на собеседовании
От: drol  
Дата: 10.06.13 11:04
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Эмм, drol, а с чем ты не согласен?


Согласно посту "жертвы собеседования", она запускала следующее:

class MyClass
{
public override int GetHashCode()
{
return 100;
}

public override bool Equals(object o)
{
MyClass m = (MyClass)o;
if (this == m) return true;
else return false;
}

public static bool operator== (MyClass left, MyClass r)
{
return false;
}

public static bool operator !=(MyClass left, MyClass r)
{
return true;
}
}


И причём тут JIT и x64 ?
Re[6]: Вопрос на собеседовании
От: Sinix  
Дата: 10.06.13 11:35
Оценка:
Здравствуйте, drol, Вы писали:

D>И причём тут JIT и x64 ?


А, в этом смысле Топикстартер вроде бы правил код (хотя с его форматированием фиг поймёшь):

B>Он есть в окончательном варианте.

B>рекурсия будет происходить вот здесь:

  public static bool operator  == (MyClass left, MyClass right)
  {      
    return left == right; // вызов этой же функции(бесконечная рекурсия), т.к. мы перегрузили этот оператор.
  }


B>Об этом и речь, получилось на реальном примере воспроизвести рекурсию. У меня нет

Re: Вопрос на собеседовании
От: alexzz  
Дата: 11.06.13 09:48
Оценка:
Здравствуйте, bo99ard, Вы писали:


        public static bool operator== (MyClass left, MyClass r)
        {
            return false;
        }

        public static bool operator !=(MyClass left, MyClass r)
        {
            return true;
        }


B>Но он все равно отрабатывает корректно.

B>Может кто нибудь сказать в чем дело?

Что делают эти методы?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.