[Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 11:05
Оценка: 10 (2)
Попробуйте предсказать, что напечатает такой код:

using System;

class Program
{
    static void Foo<T>(T x, T y)
    {
        Console.WriteLine(x.GetType());
        Console.WriteLine(x);
        Console.WriteLine(y);
    }

    static void Main()
    {
        decimal x = 0;
        Foo(x = 1, x = 2);
    }
}
Re: [Этюд] Присваивание
От: Marat.Kh  
Дата: 16.09.08 11:26
Оценка:
Здравствуйте, nikov, Вы писали:

N>Попробуйте предсказать, что напечатает такой код:


Компилер разве не ругнётся, что тип для generic метода не указан?
Re[2]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 11:27
Оценка:
Здравствуйте, Marat.Kh, Вы писали:

MK>Компилер разве не ругнётся, что тип для generic метода не указан?


Нет, он умеет выводить типы во многих случаях.
Re: [Этюд] Присваивание
От: Аноним  
Дата: 16.09.08 11:37
Оценка:
Здравствуйте, nikov, Вы писали:

N>
N>using System;

N>class Program
N>{
N>    static void Main()
N>    {
N>        decimal x = 0;
N>        Foo(x = 1, x = 2);
N>    }
N>}
N>


если бы это был С++, я бы предположил, что именно UB — порядок вычисления значений параметров неопределен. а тут — хз
Re: [Этюд] Присваивание
От: Константин Л.  
Дата: 16.09.08 11:38
Оценка:
Здравствуйте, nikov, Вы писали:

N>Попробуйте предсказать, что напечатает такой код:


N>
N>using System;

N>class Program
N>{
N>    static void Foo<T>(T x, T y)
N>    {
N>        Console.WriteLine(x.GetType());
N>        Console.WriteLine(x);
N>        Console.WriteLine(y);
N>    }

N>    static void Main()
N>    {
N>        decimal x = 0;
N>        Foo(x = 1, x = 2);
N>    }
N>}
N>


decimal
2
2
Re[2]: [Этюд] Присваивание
От: SE Украина  
Дата: 16.09.08 12:03
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>decimal

КЛ>2
КЛ>2

А не полное имя класса? System.Decimal.
На счет чисел правильно, как мне думается.
Re: [Этюд] Присваивание
От: Spiceman  
Дата: 16.09.08 12:39
Оценка: 6 (1)
Здравствуйте, nikov, Вы писали:

N> decimal x = 0;

N> Foo(x = 1, x = 2);

Вычислили первый параметр, поместили в стек, вычислили второй параметр, поместили в стек.
Чуть экзотики:
        Foo(x++, x++);

Поместили первый параметр в стек, вычислили, поместили второй параметр в стек, вычислили.
Re[3]: [Этюд] Присваивание
От: Константин Л.  
Дата: 16.09.08 12:43
Оценка:
Здравствуйте, SE, Вы писали:

SE>Здравствуйте, Константин Л., Вы писали:


КЛ>>decimal

КЛ>>2
КЛ>>2

SE>А не полное имя класса? System.Decimal.


полное, лень писать

SE>На счет чисел правильно, как мне думается.


у компилятора другое мнение
Re[4]: [Этюд] Присваивание
От: SE Украина  
Дата: 16.09.08 12:46
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, SE, Вы писали:


SE>>Здравствуйте, Константин Л., Вы писали:


КЛ>>>decimal

КЛ>>>2
КЛ>>>2

SE>>А не полное имя класса? System.Decimal.


КЛ>полное, лень писать


SE>>На счет чисел правильно, как мне думается.


КЛ>у компилятора другое мнение


Да, несколько неожиданно. Надо запомнить
Re[5]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 12:48
Оценка:
Здравствуйте, SE, Вы писали:

SE>Да, несколько неожиданно. Надо запомнить


Нет, запоминать не обязательно. Надо понять, как это работает.
Re[6]: [Этюд] Присваивание
От: Константин Л.  
Дата: 16.09.08 12:50
Оценка:
Здравствуйте, nikov, Вы писали:

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


SE>>Да, несколько неожиданно. Надо запомнить


N>Нет, запоминать не обязательно. Надо понять, как это работает.


т.е. оператор = возвращает не l-value, а то, что присвоили. Или этюд на вычисление аргументов функций?
Re[7]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 12:54
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>т.е. оператор = возвращает не l-value, а то, что присвоили.


Тут тоже есть тонкость. Присвоили то мы 1, которая имеет тип System.Int32, а в метод передалось значение типа System.Decimal.
Re[8]: [Этюд] Присваивание
От: Константин Л.  
Дата: 16.09.08 13:04
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Константин Л., Вы писали:


КЛ>>т.е. оператор = возвращает не l-value, а то, что присвоили.


N>Тут тоже есть тонкость. Присвоили то мы 1, которая имеет тип System.Int32, а в метод передалось значение типа System.Decimal.


ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal
Re[7]: [Этюд] Присваивание
От: SE Украина  
Дата: 16.09.08 13:05
Оценка:
Здравствуйте, Константин Л., Вы писали:

N>>Нет, запоминать не обязательно. Надо понять, как это работает.


А разве можно что-то запоминать по-другому?

КЛ>т.е. оператор = возвращает не l-value, а то, что присвоили. Или этюд на вычисление аргументов функций?


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

Рядом Spiceman привел неплохой пример, только с постфиксным инкрементом. Решение затруднений уже не вызвало
Re[9]: [Этюд] Присваивание
От: _FRED_ Черногория
Дата: 16.09.08 13:07
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>>>т.е. оператор = возвращает не l-value, а то, что присвоили.

N>>Тут тоже есть тонкость. Присвоили то мы 1, которая имеет тип System.Int32, а в метод передалось значение типа System.Decimal.
КЛ>ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal

Оператор "=" нельзя переопределить.
Help will always be given at Hogwarts to those who ask for it.
Re[8]: [Этюд] Присваивание
От: Marat.Kh  
Дата: 16.09.08 13:12
Оценка:
Здравствуйте, SE, Вы писали:

SE>Здравствуйте, Константин Л., Вы писали:


N>>>Нет, запоминать не обязательно. Надо понять, как это работает.


SE>А разве можно что-то запоминать по-другому?


КЛ>>т.е. оператор = возвращает не l-value, а то, что присвоили. Или этюд на вычисление аргументов функций?


SE>Мне показалось, что этюд на порядок вычисления и передачи аргументов в функцию


SE>Рядом Spiceman привел неплохой пример, только с постфиксным инкрементом. Решение затруднений уже не вызвало


По мне так еще и на то, что именно C# компилятор определит с каким типом звать функцию, а не JIT.
Я, например, не знал (понял и запомнил )
Re[10]: [Этюд] Присваивание
От: Константин Л.  
Дата: 16.09.08 13:13
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Константин Л., Вы писали:


КЛ>>>>т.е. оператор = возвращает не l-value, а то, что присвоили.

N>>>Тут тоже есть тонкость. Присвоили то мы 1, которая имеет тип System.Int32, а в метод передалось значение типа System.Decimal.
КЛ>>ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal

_FR>Оператор "=" нельзя переопределить.


это ты к чему, прости? я про built-in
Re[11]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 13:16
Оценка: +1
Здравствуйте, Константин Л., Вы писали:

КЛ>>>ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal


_FR>>Оператор "=" нельзя переопределить.

КЛ>это ты к чему, прости? я про built-in

Непонятно, что значит запись decimal.operator=. В C# оператор = не определен отдельно для каждого типа.
Re[12]: [Этюд] Присваивание
От: Константин Л.  
Дата: 16.09.08 13:26
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Константин Л., Вы писали:


КЛ>>>>ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal


_FR>>>Оператор "=" нельзя переопределить.

КЛ>>это ты к чему, прости? я про built-in

N>В C# оператор = не определен отдельно для каждого типа.


Что значит не определен?
Re[13]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 13:30
Оценка:
Здравствуйте, Константин Л., Вы писали:

N>>В C# оператор = не определен отдельно для каждого типа.


КЛ>Что значит не определен?


Я имею в виду, что нет нескольких операторов = с разными сигнатурами, в отличие, например, от оператора ==. И для него не применяется overload resolution. Поэтому запись decimal.operator= не имеет смысла.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.