namespace ref1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 2;
            swap(ref a);
            Console.WriteLine("{0}", a);
            swap(ref a, ref b);
            Console.WriteLine("{0} {1}", a, b);
            Console.ReadKey();
        }        public static void swap(ref int x)
        {
            x += 10;
        }
        public static void swap(ref int a, ref int b)
        {
            int t;
            t = a;
            a = b;
            b = t;
        }        public static int operator+(int a,int b)
        {
            return (a + 2 * b);
        }
    }
}

解决方案 »

  1.   

    退一步讲,请问这个+是重载之前的还是重载之后的?如果是重载之前的,那么如果我又创建另一个重载版本,那么两个函数交叉使用的运算符怎么定义?如果是重载之后的,这样的代码将造成无限递归,直到溢出。
    public static int operator+(int a, int b)
    {
        return (a + 2 * b);
    }C#只给类的编写者重载对应类型运算符的权利。尽管这样,我还是非常反对开发者使用重载运算符这个特性。
      

  2.   

    你拥有一个class,才能重载运算符。所以c#(至少是c#,我没有去确认.net)是要求你只有在定义一个操作符的类型的class中才能写和重载代码。所以比如说你定义了一个“主语”class,一个“谓语”class,一个“句子”class,那么你可以在这三个类型中任何一个去定义一个+运算符重载,然后写代码var a=new 主语("wo");
    var b=new 谓语("编程");
    var c=a+b;于是编译器就知道了c原来是一个句子。
      

  3.   

    你没有拥有int这个类型的定义,就无法重载+运算符。要想重载运算符,必须到int这个class的源代码中去定义。
      

  4.   

    在另一个csdn的帖子中,我举了一个例子:List<演员> list;
    表演班 team;
    ....
    list.AddRange(team);   //把team中的所有成员加入演员表可以参考:http://s.yanghao.org/program/viewdetail.php?i=32556
      

  5.   

    我重复下之前提到过的观点。比如说,重载 == 号,它必须满足严格的数学推定。== 有三个性质,传递性,a == b b == c,则a == c。交换性 a == b 则 b == a,自反性 a == a永远成立。
    重载 == 还必须同时实现 GetHashCode()再比如 + 重载,则需要满足交换律、结合律,以及和零元运算的分配律(加法运算是么元运算)
    还必须要考虑重载 ++ 运算,以及考虑二元、三元操作等等。所以事实上,没有特殊原因,不要轻易重载运算符,这方面学院的那套简直是胡搞。和C#2.0的很多新特性相反,我非常反对初学者去使用所谓的运算符重载。 重载运算符本身不复杂,但是需要考虑很多问题。为什么时间运算符系统本身没有重载,就说明这么做没有必要。很多学院派的人只看到了语法现象,没有看到重载本身的意义。