Я создаю оболочку для слова в проекте эмулятора. Это означало, что все мои конверсии в одном месте. Я как раз собирался начать реализовывать все переопределения для математических функций (+, -, /, 8, shift и т. Д.) Когда мне пришло в голову, что не все неявные позаботятся об этом? Нужно ли переедать> = и <= когда я получил> <и ==? </p>
Я подумал, что задам этот вопрос, потому что, хотя есть много вопросов, касающихся того, как их создать, не так много о том, сколько достаточно. Вот код ниже:
public struct word_t
{
ulong val;
word_t(ulong val) { this.val = val; }
public static implicit operator word_t(int a) { return new word_t((ulong)a); }
public static implicit operator word_t(long a) { return new word_t((ulong)a); }
public static implicit operator word_t(uint a) { return new word_t((ulong)a); }
public static implicit operator word_t(ulong a) { return new word_t((ulong)a); }
public static implicit operator int(word_t a) { return (int)a.val; }
public static implicit operator long(word_t a) { return (long)a.val; }
public static implicit operator uint(word_t a) { return (uint)a.val; }
public static implicit operator ulong(word_t a) { return (ulong)a.val; }
public static bool operator ==(word_t a, word_t b) { return a.val == b.val; }
public static bool operator !=(word_t a, word_t b) { return a.val != b.val; }
public static bool operator >(word_t a, word_t b) { return a.val > b.val; }
public static bool operator <(word_t a, word_t b) { return a.val < b.val; }
public override bool Equals(object obj) {
return obj.Equals(val);
}
public override int GetHashCode() {
return val.GetHashCode();
}
public override string toString() {
return val.ToString();
}
}
Моя интуиция говорит мне «доверять компилятору», но моя голова всегда беспокоится о том, насколько он эффективен.
PS Я только что понял, что должен переопределить сдвиги из-за сдвига битов проблем с отрицательными числами, но сейчас представьте, что сдвиги просто волшебным образом работают, как сложения между uint и int.