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...
Пока на собственное сообщение не было ответов, его можно удалить.