Раздражающие приведения в C # - PullRequest
1 голос
/ 11 октября 2011

Я писал довольно низкоуровневое приложение на C #, которое использует много байтовых шортов и битовых манипуляций. Одна вещь, которую я заметил, это то, что C # не любит делать битовые манипуляции и использовать логические операторы для чего-либо, кроме int. Это привело к сотням приведений во всем моем коде. Ошибки, такие как «Невозможно неявно преобразовать тип« int »в« ushort ». Существует явное преобразование (вам не хватает приведения?)»

byte b1 = 0x22;
byte b2 = 0x33;
ushort s1 = b1 << 8; // <-- Error Here
ushort s2 = s1 | b2; // <-- And Here

Это заставляет меня использовать повсюду повороты.

byte b1 = 0x22;
byte b2 = 0x33;
ushort s1 = (ushort)(b1 << 8 | b2);

Это должно быть самое большее предупреждение. Даже если b1 и b2 типа ushort, это все равно ошибка. Даже базовая арифметика, такая как сложение, дает ту же ошибку.

ushort s1 = 0x22;
ushort s2 = s1 + 0x11; // <-- Oh Come On.
ushort s3 = 8;
ushort s4 = (s1 << s3 | s2); // <-- Still an Error.

Есть ли что-нибудь вокруг этого, или мне просто нужно смириться с тем фактом, что приведение является лишь частью жизни C #, когда речь идет об использовании чего-либо, кроме целых чисел, или просто об использовании C ++, где это не проблема. *

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Если вы посмотрите на нативный код в отладчике, вы увидите, что почти вся эта арифметика в любом случае выполняется как целые числа. Я пришел к выводу, что лучше всего отразить это в моем коде, используя целочисленные значения для локальных и приводить только при копировании значения в мою структуру данных.

1 голос
/ 11 октября 2011

К сожалению, нет никакого способа обойти это. Это просто, как язык был разработан (и на самом деле он идет глубже, чем язык и в CLR , где вся побитовая логика выполняется как типы данных Int32).

Вы можете продолжать выполнять приведения, создавать функции / классы-оболочки или переключаться на небезопасный код на C ++ и делать это там.

...