Operador de atribuição de sobrecarga em C#

Eu sei que o Operador {[[2]} não pode ser sobrecarregado, mas deve haver uma maneira de fazer o que eu quero aqui:

Só estou a criar aulas para representar unidades quantitativas, já que estou a fazer um pouco de física. Aparentemente eu não posso apenas herdar de um primitivo, mas eu quero que minhas aulas se comportem exatamente como primitivos -- eu só quero que elas sejam digitadas de forma diferente.

Então eu poderia ir.
Velocity ms = 0;
ms = 17.4;
ms += 9.8;

Etc.

Não sei como fazer isto. Pensei em escrever umas aulas como então ...
class Power
{
    private Double Value { get; set; }

    //operator overloads for +, -, /, *, =, etc
}
Mas aparentemente não posso sobrecarregar o operador da missão. Há alguma maneira de conseguir este comportamento?

Author: Carson Myers, 2010-12-27

3 answers

Parece que devias estar a usar uma struct em vez de uma classe... e, em seguida, criar um operador de conversão implícito, bem como vários operadores para adição, etc.

Aqui está um código de amostra:
public struct Velocity
{
    private readonly double value;

    public Velocity(double value)
    {
        this.value = value;
    }

    public static implicit operator Velocity(double value)
    {
        return new Velocity(value);
    }

    public static Velocity operator +(Velocity first, Velocity second)
    {
        return new Velocity(first.value + second.value);
    }

    public static Velocity operator -(Velocity first, Velocity second)
    {
        return new Velocity(first.value - second.value);
    }

    // TODO: Overload == and !=, implement IEquatable<T>, override
    // Equals(object), GetHashCode and ToStrin
}

class Test
{
    static void Main()
    {
        Velocity ms = 0;
        ms = 17.4;
        // The statement below will perform a conversion of 9.8 to Velocity,
        // then call +(Velocity, Velocity)
        ms += 9.8;
    }
}

(como uma nota lateral... Eu não vejo como isso realmente representa uma velocidade, como certamente isso precisa de uma direção, bem como uma magnitude.)

 73
Author: Jon Skeet, 2011-05-17 19:56:19

Pode criar operadores de conversão implícitos. Existe uma página em MSDN com um bom exemplo.

Também é boa ideia torná-los estruturas imutáveis. É exactamente isso que os" primitivos " são, e é isso que torna impossível herdar deles. Você quer uma estrutura porque você quer semântica de tipo de valor, em vez de semântica de tipo de referência. E você os quer imutáveis porque tipos de valor mutáveis são geralmente uma idéia ruim.
 10
Author: R. Martinho Fernandes, 2010-12-27 09:57:27

Eu acho que não pode ser sobrecarregado porque as classes C# são todas derivadas de objetos, então eles são basicamente objetos, e quando você usa os operadores de atribuição, você está basicamente apenas referenciando outro objeto. Por outro lado, se você usar uma estrutura, então você basicamente precisa de toda a informação, então quando você usar = operador, todos os campos serão copiados.

Então eu diria, encare, e implemente uma função chamada Copy () e você deve estar bem: -)

 -9
Author: Rafid, 2010-12-27 09:47:41