Size: a a a

2020 August 02

AZ

Alex Zhukovsky in rust_offtopic
мог в одну строчку написать:

public static T UncheckedAddNumbers(T a, T b) => (T) ((dynamic) a + (dynamic) b)
источник

AZ

Alex Zhukovsky in rust_offtopic
это называется говнокод если что
источник

AZ

Alex Zhukovsky in rust_offtopic
и такое в прод не проходит
источник

(L

(((Mike Lubinets))) in rust_offtopic
Т-34 85
ну, пока что мне кажется, что вот так лучше всего. Нет проверки на переполнение, не так много лишних типов могут пролезть в рантайм

public static ValueType UncheckedAddNumbers(this IConvertible numeric1, IConvertible numeric2)
       {
           bool isNumeric1 = numeric1 switch
           {
               byte number => true,
               sbyte number => true,
               Int16 number => true,
               UInt16 number => true,
               Int32 number => true,
               UInt32 number => true,
               Int64 number => true,
               UInt64 number => true,
               double number => true,
               float number => true,
               _ => false,
           };
           bool isNumeric2 = numeric2 switch
           {
               byte number => true,
               sbyte number => true,
               Int16 number => true,
               UInt16 number => true,
               Int32 number => true,
               UInt32 number => true,
               Int64 number => true,
               UInt64 number => true,
               double number => true,
               float number => true,
               _ => false,
           };
           if (!isNumeric1 || !isNumeric2)
           {
               throw new ArgumentException("Arguments must be a numeric type");
           }
           dynamic number1 = numeric1;
           dynamic number2 = numeric2;
           return number1 + number2;
       }
Is this Golang?
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
ну, пока что мне кажется, что вот так лучше всего. Нет проверки на переполнение, не так много лишних типов могут пролезть в рантайм

public static ValueType UncheckedAddNumbers(this IConvertible numeric1, IConvertible numeric2)
       {
           bool isNumeric1 = numeric1 switch
           {
               byte number => true,
               sbyte number => true,
               Int16 number => true,
               UInt16 number => true,
               Int32 number => true,
               UInt32 number => true,
               Int64 number => true,
               UInt64 number => true,
               double number => true,
               float number => true,
               _ => false,
           };
           bool isNumeric2 = numeric2 switch
           {
               byte number => true,
               sbyte number => true,
               Int16 number => true,
               UInt16 number => true,
               Int32 number => true,
               UInt32 number => true,
               Int64 number => true,
               UInt64 number => true,
               double number => true,
               float number => true,
               _ => false,
           };
           if (!isNumeric1 || !isNumeric2)
           {
               throw new ArgumentException("Arguments must be a numeric type");
           }
           dynamic number1 = numeric1;
           dynamic number2 = numeric2;
           return number1 + number2;
       }
и это не работает для матриц например, для которых тоже есть оператор сложения
источник

Т8

Т-34 85 in rust_offtopic
Alex Zhukovsky
мог в одну строчку написать:

public static T UncheckedAddNumbers(T a, T b) => (T) ((dynamic) a + (dynamic) b)
для начала, у тебя a и b тут обязаны быть одинаковым типом, разве нет? Что будет, если я передам sbyte и  UInt32?
источник

Т8

Т-34 85 in rust_offtopic
Alex Zhukovsky
и это не работает для матриц например, для которых тоже есть оператор сложения
а матрицы - это числа?
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
а матрицы - это числа?
ну хорошо, пусть будут комплексные числа
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
для начала, у тебя a и b тут обязаны быть одинаковым типом, разве нет? Что будет, если я передам sbyte и  UInt32?
Ну сделать T, U.

А ещё у тебя боксинг происходит
источник

AZ

Alex Zhukovsky in rust_offtopic
а ещё вместо ошибки компиляции UncheckedAddNumbers("hello", "world") даст эксепшн
источник

Т8

Т-34 85 in rust_offtopic
Alex Zhukovsky
ну хорошо, пусть будут комплексные числа
они в языке есть? Если нет, то тебе в Rust пришлось бы определять операции для них
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
они в языке есть? Если нет, то тебе в Rust пришлось бы определять операции для них
ничего страшного, я готов определить
источник

AZ

Alex Zhukovsky in rust_offtopic
мне нужно чтобы код работал когда у тебя нет готового списка sbyte/byte, не говоря про то что это выглядет херово
источник

Т8

Т-34 85 in rust_offtopic
Alex Zhukovsky
Ну сделать T, U.

А ещё у тебя боксинг происходит
а тип возвращаемого значения какой будет?

Да, боксинг будет, знаю
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
а тип возвращаемого значения какой будет?

Да, боксинг будет, знаю
ну вот чтобы про это не думать в самом простом варианте все типы совпадают
источник

Т8

Т-34 85 in rust_offtopic
Alex Zhukovsky
а ещё вместо ошибки компиляции UncheckedAddNumbers("hello", "world") даст эксепшн
ну извини. Если работать со стандартными типами, то так. Можно свои типы определить, тогда можно отсечь
источник

AZ

Alex Zhukovsky in rust_offtopic
Т-34 85
ну извини. Если работать со стандартными типами, то так. Можно свои типы определить, тогда можно отсечь
ну вот а с тайпклассами и "странным объявлением снаружи" такое можно сделать
источник

AZ

Alex Zhukovsky in rust_offtopic
и не будет ни боксинга
источник

AZ

Alex Zhukovsky in rust_offtopic
ни угробищной копипасты if blabla is Something
источник

Т8

Т-34 85 in rust_offtopic
Alex Zhukovsky
ничего страшного, я готов определить
тогда оставить dynamic только для стандартных типов
источник