c#中 在什么情况下使用 转换操作符方法和运算符重载

解决方案 »

  1.   

    http://blog.csdn.net/hustorochi/archive/2007/05/13/1607079.aspx
      

  2.   

    问题问的蛮好。
    个人认为,尽量不使用运算符重载。
    因为操作符重载不当会导致结果错误,虽然不是异常。但很要命的。当然你可以说人为的避免,希望可以避免吧。
    演示一个操作重载带来的不同表现:static void Main(string[] args)
    {
        B obj1 = new B(1);
        B obj2 = new B(2);
        B result2 = obj1 + obj2;//B类型的+
        A result = (A)obj1 + (A)obj2;//调用A类型的+
        Console.WriteLine("+ by B cast : " + result2.ToString());
        Console.WriteLine("+ by (A) cast : " + result.ToString());
        Console.ReadKey();
    }public class A
    {
        public int Value { get; set; }
        public A(int v)
        {
            Value = v;
        }
        public static A operator +(A obj1, A obj2)
        {
            return new A(obj1.Value + obj2.Value);
        }
        public override string ToString()
        {
            return Value.ToString();
        }
    }public class B : A
    {
        public B(int v) : base(v) { }
        public static B operator +(B obj1, B obj2)
        {
            return new B(obj1.Value * obj2.Value);
        }
    }
    如果你对子类和父类的某一个操作符定义了不同的实现,那这个不会如你期望的面向对象,而是根据你转换类型而定的,你转换为父类,则调用父类的方法。可能还不明白,看到帖子的人会问,那我怎么会那么蠢,这么干呢?你会不小心的。面向对象的开发思路下,我们可能习惯了用基类操作,使用接口或基类,可以编写不基于实现的,具有扩展性的程序,那如果不同的子类重新的实现了操作重载,你用一个基类的引用指向这个对象的时候,将不会执行子类的操作符重载,这和开发的预期是不同的。这样的问题可能很隐晦,如果项目中出现了,我想要准确找到此类问题会非常有难度。所以,个人认为,尽可能不使用操作符重载。当然,不是绝对的。