2011-12-28 2 views
-4

У меня есть основной вопрос относительно литья типов.Есть ли листинг типа C# здесь?

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(); 

В приведенном выше коде будет ли листинг типа литьем?

ответ

1

Вы используете явное приведение типа (А) Ь в обоих случаях. Таким образом, приведение типов происходит в обоих случаях. Если явное литье удалено, то в первом случае произойдет неявное литье, а второй случай не будет иметь кастинг, так как он будет таким же, как b.process().

+0

Thanx Aditya, не могли бы вы рассказать об этом, будет ли компилятор генерировать соответствующий код типа Casting IL? – LokiDil

+0

Для понижающего преобразования в новой переменной сохраняется только ссылка. Но для генерации команды классной генерации. Кроме того, во втором случае генерируемая команда предназначена для прямого вызова IA.process вместо любых команд литья. – Aditya

+0

Thanx Aditya, который помогает мне понять – LokiDil

0

Я рекомендую вам создать класс конвертер для литья класса А к классу В.

+0

Thanx Dmity, я хотел бы знать, как компилятор будет вести себя в этих случаях, будет ли он бросать или просто указывать ссылку на него? – LokiDil

+0

Извините, я не знаю. Но способ, как я сказал, является лучшим решением. Да, для написания кода требуется время, но каждое свойство класса находится под вашим контролем. –

Смежные вопросы