Я пытаюсь перегрузить оператор += ... конечно, это невозможно с помощью кода, но если меня не обманула документация, то после перегрузки оператора + оператор += будет неявно перегружен.
public class Register {
private byte data;
public Register(byte value = 0x00) { data = value; }
public Register(Register value)
{
data = value.data;
}
public static byte operator +(Register lvalue, byte rvalue)
{
return (byte)(lvalue.data + rvalue);
}
public static byte operator +(byte lvalue, Register rvalue)
{
return (byte)(lvalue + rvalue.data);
}
public static implicit operator byte(Register value) => value.data;
}
Я пробовал использовать многие другие операторы, и результат более или менее тот же. Компилятор жалуется (вместо компиляции) на отсутствие явного приведения.
Ошибка:
Ошибка компиляции (строка 140, столбец 3): невозможно неявно преобразовать тип. «Байт» на «Регистр». Существует явное преобразование (вам не хватает бросать?)
«компилятор жалуется». Пожалуйста, включите в вопрос также ошибку компилятора.
@phuzi, я предоставил скрипку на всякий случай...
Похоже, вам нужно неявное преобразование из byte в Register.
Но в вопросе ошибка не указана.
Опубликуйте ошибочный код и фактическую ошибку компилятора в самом вопросе. Операторы вопроса возвращают byte, но register += пытается присвоить результат переменной Register.





Ваш оператор + возвращает byte, поэтому += эквивалентно:
Register = Register + byte
Но byte нельзя неявно привести обратно к Register (только явно). Либо сделайте ваш explicit operator Register(byte value) неявным:
public static implicit operator Register(byte value) => new Register(value);
или верните оператор + Register:
public static Register operator +(Register lvalue, byte rvalue)
{
return (Register)(byte)(lvalue.data + rvalue);
}
«сделайте ваш explicit operator Register(byte value) неявным» - или ОП мог бы «добавить еще один explicit operator, который возвращает Register, а не byte»
@stuartd правда, но нельзя использовать один и тот же оператор с разными типами возвращаемого значения (byte +(Register, byte) и Register +(Register,byte) не компилируются); и у них есть неявное приведение регистра к байту, если им все равно нужно внутреннее значение байта.
вам также следует решить, действительно ли вы хотите, чтобы Register был неизменяемым в этом случае, или нет, потому что, как вы это делаете, каждая операция будет создавать новый Register в куче, и «Register» кажется мне немного критичным к производительности. если вы не хотите, чтобы он был неизменным, вы можете подумать о том, чтобы не использовать здесь перегрузку операторов, и придерживаться методов добавления и т. д.
@MichaelSchönbauer не обманывайтесь именем: класс Register не будет использоваться в сценариях, связанных с производительностью (он является частью эмулятора, но не работает в режиме реального времени). Но ваша точка зрения все равно интересна....
A = (Register)(A + (byte)0x0F);работает