Си диез / Говнокод #19909 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
using System;

public class Test
{
	 private static void Main(string[] args)
        {
            int d = 2147483647;

            Console.WriteLine(d);

            long g = 2147483647+d;

            Console.WriteLine(g);

            long k = new MyClass() + new MyClass();

            Console.WriteLine(k);
        }

        public class MyClass
        {
            public static implicit operator int(MyClass m)
            {
                return 5;
            }

            public static implicit operator long(MyClass m)
            {
                return 100;
            }
        }
}

Типушня

Запостил: kegdan kegdan, (Updated )

Комментарии (48) RSS

    • Коллекция гранат, которые можно бросить себе под ноги в случае опасности.
      Ответить
  • Я правильно понимаю, что + срёт на тип переменной, которой присваивается его результат, и кастит всё в int?
    Ответить
    • > тип переменной, которой присваивается его результат
      А он его и не знает. Это ж не хаскель.
      Ответить
        • потому что + работает с интами - MyClass кастится в инт неявно - все норм. результат инт - неявно кастится в лонг - все норм
          Ответить
          • Но кресты-то выдают сообщение о неоднозначной перегрузке плюса. У них находится как минимум четыре кандидата: int+int, long+int, int+long, long+long. А шарпик молча выбирает int+int.
            Ответить
            • в шарпе 2 варианта int+int и long+long

              инт предпочтительней, это нужно знать
              Ответить
    • блядская неявность. Сначала все неявно кастится в инт, а потом результат неявно кастится в лонг. implicit - зло
      Ответить
      • После этого хочется писать в таком стиле:
        long y = (long)((long)2 * (long)x - (long)3)*(long)x + (long)5;

        Чтобы уж наверняка.
        Ответить
              • А с тремя слагаемыми? Хочется посмотреть более тонкие эффекты.
                (float)x() + x() + x() // питушение в float всех?
                x() + (float)x() + x() // питушение в float всех?
                x() + x() + (float)x() // питушение в float только последнего?
                Ответить
                • Так и будет: https://ideone.com/JjeWLy

                  Вычисление слева направо в типе наименьшего диапазона.

                  В третьем выражении первые два слагаемых будут интами и только для добавления «плавающего» слагаемого их сумма переведётся во float.
                  Ответить
              • Значит, про поиск типа, начиная с наименьшего диапазона, я угадал.
                Ответить
    • Подозреваю, что тут так же, как и в Си, и в Паскале: сначала вычисляется выражение. Его тип выводится как тип, имеющий минимальный диапазон (сначала короткие инты, потом средние, потом длинные, потом плавающие питухи и т. п.), а уже потом вычисленное выражение (какого бы типа оно ни было) приводится к типу левой части.

      Например, в перечисленных языках при сложении двух интов легко поймать переполнение (даже если в левой части «длинный» тип), если не вставить у одного из слагаемых явный каст в длинный инт.

      И тут, как я понял, перебор начинается с типов минимально возможного диапазона. Можно уложиться в инт — считаем в инте, и только оператор присвоения будет приводить результат к лонгу.
      Ответить
  • http://ideone.com/MOLqkH
    А вот заботливые кресты спасают программиста от неоднозначностей. Какой юзер-френдли язык!
    Ответить
    • Это про программирование, тебе не понять

      забей в общем
      Ответить
    • > public static implicit operator long
      > Штоэта?

      "long operator" это программерский слэнг для пениса. остальное сам догадаешься (например "public" это таг для эксгибиционизма).
      Ответить
  • Кстати, без implicit надо будет писать явный каст?
    Ответить
    • Если вместо implicit написать explicit, то нужно будет писать

      (long) new MyClass()

      Иначе пошлет из-за несовместимости типов
      Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8