在C#中重载赋值运算符

Car*_*ers 60 c# operator-overloading

我知道=操作员不能超载,但必须有办法在我这里做我想要的:

我只是创建代表定量单位的类,因为我正在做一些物理学.显然我不能只从一个原语继承,但我希望我的类的行为与原语完全一样 - 我只是希望它们的输入方式不同.

所以我可以去,

Velocity ms = 0;
ms = 17.4;
ms += 9.8;
Run Code Online (Sandbox Code Playgroud)

等等

我不知道该怎么做.我想我会写一些像这样的类:

class Power
{
    private Double Value { get; set; }

    //operator overloads for +, -, /, *, =, etc
}
Run Code Online (Sandbox Code Playgroud)

但显然我不能重载赋值运算符.我有什么方法可以得到这种行为吗?

Jon*_*eet 90

听起来你应该使用结构而不是类...然后创建一个隐式转换运算符,以及各种运算符来添加等.

这是一些示例代码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(作为旁注......我不知道这是如何真正代表速度的,因为当然需要方向和幅度.)

  • @Henk:不,*speed*是标量,但速度有方向.请参阅http://en.wikipedia.org/wiki/Velocity - "这是一个矢量物理量;定义它需要幅度和方向." (7认同)
  • 完善!谢谢.还有......你是对的.很显然,我的物理学教授没有把矢量猛烈地压入我的大脑:) (3认同)
  • 有什么理由这不能是一个类吗?我希望从`ScalarUnit` 或`VectorUnit` 类继承,以免为每个单元重复_everything_,显然结构不能继承 (2认同)
  • @Carson:你*可以*使它成为一个类,但听起来它更适合作为值类型,因为它代表了一个合理的原始“值”而不是一个自然的“对象”。一个类的代码基本上是一样的,所以你可以很容易地对两者进行试验。但是,您将难以在继承树中表达运算符... (2认同)

R. *_*des 10

您可以创建隐式转换运算符.MSDN上有一个页面,有一个很好的例子.

使它们成为不可变结构也是一个好主意.这正是"基元"的含义,而这就是不可能继承它们的原因.您需要一个结构,因为您需要值类型语义,而不是引用类型语义.而且你希望它们不可变,因为可变值类型通常是个坏主意.