[Этюд] Присваивание
От: 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= не имеет смысла.
Re[14]: [Этюд] Присваивание
От: Константин Л.  
Дата: 16.09.08 13:33
Оценка:
Здравствуйте, nikov, Вы писали:

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


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


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


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


но есть же какие то правила, по которым компайлер опеределяет, что чему можно присвоить, и каков будет результат, так? наверняка их несколько. и каждое можно чисто гипотетически представить в виде decimal.operator=

Decimal operator =(Int32)
Decimal operator =(Int64)
...
Re[15]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 13:44
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>но есть же какие то правила, по которым компайлер опеределяет, что чему можно присвоить, и каков будет результат, так? наверняка их несколько.


Правила для присваивания не зависят от типов левой и правой части (см. 7.16.1 Simple assignment). Но они требуют наличия неявного преобразования, правила для которого уже зависят от типов и описаны в главе 6.1 Implicit conversions.
Re[16]: [Этюд] Присваивание
От: Константин Л.  
Дата: 16.09.08 13:50
Оценка:
Здравствуйте, nikov, Вы писали:

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


КЛ>>но есть же какие то правила, по которым компайлер опеределяет, что чему можно присвоить, и каков будет результат, так? наверняка их несколько.


N>Правила для присваивания не зависят от типов левой и правой части (см. 7.16.1 Simple assignment). Но они требуют наличия неявного преобразования, правила для которого уже зависят от типов и описаны в главе 6.1 Implicit conversions.


чтд?
Re: [Этюд] Присваивание
От: Аноним  
Дата: 16.09.08 14:21
Оценка:
Здравствуйте, 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>


System.Decimal
1
2
Как и предполагалось. В чем смысл этюда?
Re[2]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 14:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как и предполагалось. В чем смысл этюда?


Можешь объяснить результат?
Re[3]: [Этюд] Присваивание
От: Аноним  
Дата: 16.09.08 14:39
Оценка:
Здравствуйте, nikov, Вы писали:

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


А>>Как и предполагалось. В чем смысл этюда?


N>Можешь объяснить результат?


(x = 1) — rvalue типа Decimal (структура), аргументы функции вычисляются по порядку и кладутся на стек.
Re[4]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 14:41
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>(x = 1) — rvalue типа Decimal (структура), аргументы функции вычисляются по порядку и кладутся на стек.


Почему x = 1 имеет тип Decimal?
Re[5]: [Этюд] Присваивание
От: Marat.Kh  
Дата: 16.09.08 14:48
Оценка:
Здравствуйте, nikov, Вы писали:

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


А>>(x = 1) — rvalue типа Decimal (структура), аргументы функции вычисляются по порядку и кладутся на стек.


N>Почему x = 1 имеет тип Decimal?


Так эта... "decimal x"
Re[6]: [Этюд] Присваивание
От: nikov США http://www.linkedin.com/in/nikov
Дата: 16.09.08 14:52
Оценка:
Здравствуйте, Marat.Kh, Вы писали:

N>>Почему x = 1 имеет тип Decimal?


MK>Так эта... "decimal x"


Это доказывает, что x имеет тип decimal, но чтобы что-то сказать о типе выражения x = 1, нужны дополнительные аргументы.
Re[7]: [Этюд] Присваивание
От: Marat.Kh  
Дата: 16.09.08 14:56
Оценка:
Здравствуйте, nikov, Вы писали:

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


N>>>Почему x = 1 имеет тип Decimal?


MK>>Так эта... "decimal x"


N>Это доказывает, что x имеет тип decimal, но чтобы что-то сказать о типе выражения x = 1, нужны дополнительные аргументы.


Можно добавить слова о неявном преобразовнии типов, но оно то влияет лишь на значение (содержимое, если позволите), но не на тип переменной.
Re[7]: [Этюд] Присваивание
От: Аноним  
Дата: 16.09.08 14:58
Оценка:
Здравствуйте, nikov, Вы писали:

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


N>>>Почему x = 1 имеет тип Decimal?


MK>>Так эта... "decimal x"


N>Это доказывает, что x имеет тип decimal, но чтобы что-то сказать о типе выражения x = 1, нужны дополнительные аргументы.

Если ты о стандарте, то я его не знаю столь глубоко. Но выражение (lvalue = rvalue) всегда имеет статический тип lvalue. Почему с Decimal должно быть иначе — непонятно. Вопрос конкретно о Decimal или конкретно о типе выражения (lvalue = rvalue) или его значении?
Re[7]: [Этюд] Присваивание
От: Alexey M.  
Дата: 16.09.08 15:03
Оценка: 13 (1)
Здравствуйте, nikov, Вы писали:

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


N>>>Почему x = 1 имеет тип Decimal?


MK>>Так эта... "decimal x"


N>Это доказывает, что x имеет тип decimal, но чтобы что-то сказать о типе выражения x = 1, нужны дополнительные аргументы.


Из спецификации:

The result of a simple assignment expression is the value assigned to the left operand. The result has the same type as the left operand and is always classified as a value.

Re[8]: [Этюд] Присваивание
От: Аноним  
Дата: 16.09.08 15:12
Оценка:
Здравствуйте, Alexey M., Вы писали:

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


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


N>>>>Почему x = 1 имеет тип Decimal?


MK>>>Так эта... "decimal x"


N>>Это доказывает, что x имеет тип decimal, но чтобы что-то сказать о типе выражения x = 1, нужны дополнительные аргументы.


AM>Из спецификации:

AM>

AM>The result of a simple assignment expression is the value assigned to the left operand. The result has the same type as the left operand and is always classified as a value.



using System;

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

    interface I {}
    class C : I {}
    
    static void Main() {
        I x = null;
        Foo(x = new C(), x = new C());
    }
}


The result of a simple assignment expression is the value assigned to the left operand —
Re[9]: [Этюд] Присваивание
От: Alexey M.  
Дата: 16.09.08 15:20
Оценка:
Здравствуйте, Аноним, Вы писали:

AM>>Из спецификации:

AM>>

AM>>The result of a simple assignment expression is the value assigned to the left operand. The result has the same type as the left operand and is always classified as a value.


А>
А>using System;

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

А>    interface I {}
А>    class C : I {}
    
А>    static void Main() {
А>        I x = null;
А>        Foo(x = new C(), x = new C());
А>    }
А>}
А>


А>The result of a simple assignment expression is the value assigned to the left operand —


А в чем здесь вопрос? В том что выводится I?
Если записать так:
using System;

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

    interface I {}
    class C : I {}
    
    static void Main() {
        I x = null;
        Foo(x = new C(), x = new C());
    } 
}

то выведется С.
Re[10]: [Этюд] Присваивание
От: Аноним  
Дата: 16.09.08 15:38
Оценка:
Здравствуйте, Alexey M., Вы писали:

А>>The result of a simple assignment expression is the value assigned to the left operand —


AM>А в чем здесь вопрос? В том что выводится I?

the value assigned == new C() --> The result == new C() --> typeof(The result) == typeof(new C())
Re[11]: [Этюд] Присваивание
От: Alexey M.  
Дата: 16.09.08 15:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alexey M., Вы писали:


А>>>The result of a simple assignment expression is the value assigned to the left operand —


AM>>А в чем здесь вопрос? В том что выводится I?

А>the value assigned == new C() --> The result == new C() --> typeof(The result) == typeof(new C())

Насколько я понимаю вы путаете статический и динамический типы.
Re: [Этюд] Присваивание
От: MxKazan Португалия  
Дата: 16.09.08 17:20
Оценка:
Здравствуйте, 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>


Пишет тот же что Marat.Kh — вспомнил, что можно просто ники поменять.

А правильное по мнению автора объяснение будет?
Re[7]: [Этюд] Присваивание
От: vdimas Россия  
Дата: 17.09.08 09:00
Оценка:
Здравствуйте, nikov, Вы писали:


N>Это доказывает, что x имеет тип decimal, но чтобы что-то сказать о типе выражения x = 1, нужны дополнительные аргументы.


Это еще из первого дотнета, можно было бы привести любой пример с неявным преобразованием какого либо Foo к некоему Bar.
... << RSDN@Home 1.2.0 alpha rev. 786>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.