【问题标题】:Does type casting in C# occur here?C# 中的类型转换是否发生在这里?
【发布时间】:2012-01-29 03:27:21
【问题描述】:

我有一个关于类型转换的基本问题。

class A { }
class B : A { }

B b = new B();
A a = (A)b;

上面的代码中是否会发生类型转换?

    interface IA
    {
        void process();
    }

    class B : IA
    {
        #region IA Members

        void IA.process()
        {
            throw new NotImplementedException();
        }

        #endregion
        public void process() { }
    }

    B b = new B();
    b.process();
    ((IA)b).process();

上面的代码中是否会发生类型转换?

【问题讨论】:

    标签: c# interface casting explicit-interface


    【解决方案1】:

    在这两种情况下,您都在使用像 (A)b 这样的显式转换。所以在这两种情况下都会发生类型转换。如果显式转换被移除,那么在第一种情况下会发生隐式转换,第二种情况不会有任何转换,因为它与 b.process() 相同。

    【讨论】:

    • Thanx Aditya,您能否简要介绍一下编译器是否会为 IL 生成适当的类型转换代码??
    • 对于向下转换,只有引用存储在新变量中。但是对于向上转换,会生成 classcast 指令。另外,在第二种情况下,生成的指令是直接调用 IA.process 而不是任何转换指令。
    【解决方案2】:

    我建议你创建一个类转换器来将 A 类转换为 B 类。

    【讨论】:

    • Thanx Dmity,我想知道编译器在这些情况下的行为是它会强制转换还是只是指向它的引用??
    • 对不起,我不知道。但正如我所说的方式是最好的解决方案。是的,编写一些代码需要时间,但类的每个属性都在您的控制之下。
    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2020-07-14
    • 1970-01-01
    • 2018-02-18
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多