假设有两个Class A 和B,其中A和B的方法和属性都完全一样,但A和B之间没有任何继承关系。
Class A
{...}
Class B
{...}现在我希望A和B的两个引用指向同一个引用,类似如下代码:
A a = null;
B b = new B();
a = (A)b;显然上边代码是编译不通过的,但是基本上我想实现这个功能,使用指针也可以。请问c#可以做到吗?
我使用C++反正是可以的.求教啊。

解决方案 »

  1.   

    Class A 
    {...} 
    Class B 
    {...} 
    A 和 B都继承到C 就行了
      

  2.   

    类的继承关系  是怎么继承的呢?B继承A...A a= new A();
    B b= new B();
    a= new B();   或  a= (A)b;  
    这样都是可以的啊 
    我是小菜鸟!   说的不好清见谅,   希望能够帮到你!
      

  3.   

    这个样子行不行 你看看
    unsafe void ExChange(ClassA a,ClassB b)
    {
         void* pt1=&a;
         void* pt2=&b;     pt1=p2;
    }要把编译命令的不安全模式打开
      

  4.   

    A B 都继承自C?那A B 应该是并列类啊   这样的转换好象不可以吧?帮你顶上去   我也学习下
      

  5.   

    to Deathsign :
     您的代码会报这个错误:Error 1 Cannot take the address of, get the size of, or declare a pointer to a managed type ('ConsoleApplication1.Class1') D:\ProjectTEst\Project\ConsoleApplication1\ConsoleApplication1\Program.cs 95 25 ConsoleApplication1
      

  6.   

    to SuperTyro :A和B这两个类也没有共同的父类或者接口。
      

  7.   

    自定义类型转换
    public static explicit operator A(B b)
    {
    //.......
    }
      

  8.   

    to NewUser2008 :
    如jun_yuner 所说,您的这个方法也仅仅是自定义拷贝转换,而不能实现 两个引用指向同一个对象
      

  9.   


    显然,引用只是对象的别名,你不可能1个引用指向2个对象。不同类型,.net提供了类型转换操作符重载,但这肯定不是同一个对象了。
      

  10.   

    你如果希望==可以比较是否一样,考虑重载操作符==,也重载Equal
      

  11.   

    to KissXYL :
    不是啊,我的目的就是希望两个引用指向同一个实例。
    to KissXYL :
    并不是要求一个引用指向两个对象,而是两个引用指向同一块内存。
    这个使用c++完全可以实现。
      

  12.   

    明白你意思了。
    c#里不可能的
    c++里:
    A* a = NULL; 
    B* b = new B(); 
    a = (A*)b;这里你是创建了一个B对象,然后强制类型转换,使用A的访问方法来操作B。这样在c++里也是不推荐的。需要你A,B内存排列一致,并且字节对齐也要一致。如果其中一个还有继承关系,那虚函数也可能造成访问地址的不一致。这样很危险的。c#里不可以这样做。
      

  13.   

    使用基于接口的编程
    class A : ISomething
    {...} 
    class B : ISomething
    {...} interface ISomething
    {
    // A,B共有的属性和方法
    }ISomething a = null; 
    ISomething b = new B(); 
    a = b;
      

  14.   

    class a
        {
            public void function()
            {
                Console.WriteLine("a的方法");
                Console.ReadLine();
            }
        }
        class b
        {
            public void function()
            {
                Console.WriteLine("b的方法");
                Console.ReadLine();
            }        public static implicit operator a(b b2)
            {
                return (a)(b2);
            }
        }
      
       
        
        class Program
        {
          
            static void Main(string[] args)
            {
                a a1 = null;
                b b1 = new b();
                a1 = (a)(b1);
                a1.function();
                b1.function();
            }
        }
      

  15.   

    C++里面是指向指针地址而已,所有的类实际上都是指针类型,所以强制转换不是问题,只要你知道当前指针指向的对象是什么类型就可以避免出错了,.NET里面就要自己重载运算符才可以。
    这种写法无论在什么语言里都不应该使用了,明显容易造成混乱和不确定的错误。
      

  16.   

    to fengweizhijie :
    您的回复使我学了一招啊,没想到这样居然可以编译过去。不过呢,我的需求是不能修改既存代码(A和B)。to KissXYL :
     就是您说的那个意思。
     
    看来我的需求c#是完成不了啊 ,再放放,今晚或明早结贴。
      

  17.   

    这个东西你要先明白内存寻址方式。基地址+偏移量你本身的要求,实际是传递基地址。
    a = (A)b; 
    这样就出现了问题,其成员偏移量是不同的,sizeof(B)>sizeof(A)转换到是可以,但是就算转换成功了,也没啥意义,因为成员偏移量不同,a.c和b.c两个东西指的完全不是一样的东西。如果sizeof(B)<sizeof(A),这个成员直接越界了,编译都不会让你编译过去,这个就是C#里规定子类可以转换成父类,而父类无法转成子类的原因。
      

  18.   

    接口编程只是对接口的实例化,没有对类A实例化。没有达到LZ的要求。
      

  19.   

    To wanghui0380 :
    实际上我的假设是A和B内容完全一样,简单描述就是说,我先写了个类A,然后拷贝A类源码,仅修改类名成为了B,
    此时sizeof(B)应该是等于sizeof(A)了吧。另外,今天我又做了些思考,觉得不见得不推荐的方法就是不能做到的,譬如C++中本来我们不能访问私有成员或函数,但我们却可以通过内联汇编来突破这个限制。 所以我觉得c#中也许我们也能突破这个类型转换的限制呢。