Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, SE, Вы писали:
SE>>Здравствуйте, Константин Л., Вы писали:
КЛ>>>decimal КЛ>>>2 КЛ>>>2
SE>>А не полное имя класса? System.Decimal.
КЛ>полное, лень писать
SE>>На счет чисел правильно, как мне думается.
КЛ>у компилятора другое мнение
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, SE, Вы писали:
SE>>Да, несколько неожиданно. Надо запомнить
N>Нет, запоминать не обязательно. Надо понять, как это работает.
т.е. оператор = возвращает не l-value, а то, что присвоили. Или этюд на вычисление аргументов функций?
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Константин Л., Вы писали:
КЛ>>т.е. оператор = возвращает не l-value, а то, что присвоили.
N>Тут тоже есть тонкость. Присвоили то мы 1, которая имеет тип System.Int32, а в метод передалось значение типа System.Decimal.
ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal
Здравствуйте, Константин Л., Вы писали:
КЛ>>>т.е. оператор = возвращает не l-value, а то, что присвоили. N>>Тут тоже есть тонкость. Присвоили то мы 1, которая имеет тип System.Int32, а в метод передалось значение типа System.Decimal. КЛ>ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal
Оператор "=" нельзя переопределить.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, SE, Вы писали:
SE>Здравствуйте, Константин Л., Вы писали:
N>>>Нет, запоминать не обязательно. Надо понять, как это работает.
SE>А разве можно что-то запоминать по-другому?
КЛ>>т.е. оператор = возвращает не l-value, а то, что присвоили. Или этюд на вычисление аргументов функций?
SE>Мне показалось, что этюд на порядок вычисления и передачи аргументов в функцию
SE>Рядом Spiceman привел неплохой пример, только с постфиксным инкрементом. Решение затруднений уже не вызвало
По мне так еще и на то, что именно C# компилятор определит с каким типом звать функцию, а не JIT.
Я, например, не знал (понял и запомнил )
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Константин Л., Вы писали:
КЛ>>>>т.е. оператор = возвращает не l-value, а то, что присвоили. N>>>Тут тоже есть тонкость. Присвоили то мы 1, которая имеет тип System.Int32, а в метод передалось значение типа System.Decimal. КЛ>>ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal
_FR>Оператор "=" нельзя переопределить.
Здравствуйте, Константин Л., Вы писали:
КЛ>>>ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal
_FR>>Оператор "=" нельзя переопределить. КЛ>это ты к чему, прости? я про built-in
Непонятно, что значит запись decimal.operator=. В C# оператор = не определен отдельно для каждого типа.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Константин Л., Вы писали:
КЛ>>>>ну, как я понимаю, это все зависит от decimal.operator=. Было бы странно, чтобы он возвращал не decimal
_FR>>>Оператор "=" нельзя переопределить. КЛ>>это ты к чему, прости? я про built-in
N>В C# оператор = не определен отдельно для каждого типа.
Здравствуйте, Константин Л., Вы писали:
N>>В C# оператор = не определен отдельно для каждого типа.
КЛ>Что значит не определен?
Я имею в виду, что нет нескольких операторов = с разными сигнатурами, в отличие, например, от оператора ==. И для него не применяется overload resolution. Поэтому запись decimal.operator= не имеет смысла.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Константин Л., Вы писали:
N>>>В C# оператор = не определен отдельно для каждого типа.
КЛ>>Что значит не определен?
N>Я имею в виду, что нет нескольких операторов = с разными сигнатурами, в отличие, например, от оператора ==. И для него не применяется overload resolution. Поэтому запись decimal.operator= не имеет смысла.
но есть же какие то правила, по которым компайлер опеределяет, что чему можно присвоить, и каков будет результат, так? наверняка их несколько. и каждое можно чисто гипотетически представить в виде decimal.operator=
Здравствуйте, Константин Л., Вы писали:
КЛ>но есть же какие то правила, по которым компайлер опеределяет, что чему можно присвоить, и каков будет результат, так? наверняка их несколько.
Правила для присваивания не зависят от типов левой и правой части (см. 7.16.1 Simple assignment). Но они требуют наличия неявного преобразования, правила для которого уже зависят от типов и описаны в главе 6.1 Implicit conversions.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Константин Л., Вы писали:
КЛ>>но есть же какие то правила, по которым компайлер опеределяет, что чему можно присвоить, и каков будет результат, так? наверняка их несколько.
N>Правила для присваивания не зависят от типов левой и правой части (см. 7.16.1 Simple assignment). Но они требуют наличия неявного преобразования, правила для которого уже зависят от типов и описаны в главе 6.1 Implicit conversions.
чтд?
Re: [Этюд] Присваивание
От:
Аноним
Дата:
16.09.08 14:21
Оценка:
Здравствуйте, nikov, Вы писали:
N>Попробуйте предсказать, что напечатает такой код:
N>
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, Аноним, Вы писали:
А>>(x = 1) — rvalue типа Decimal (структура), аргументы функции вычисляются по порядку и кладутся на стек.
N>Почему x = 1 имеет тип Decimal?
Здравствуйте, 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) или его значении?
Здравствуйте, 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 —
Здравствуйте, Аноним, Вы писали:
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())
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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())
Насколько я понимаю вы путаете статический и динамический типы.