2014-10-18 3 views
0
namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      C c = new C(); 
      c = new B(); 

     } 
    } 

    class B 
    { 

    } 
    class C : B 
    { 

    } 

} 

, пожалуйста, кто-нибудь может объяснить эту ошибку? Я новичок в кодировании. Я хочу проверить свойства скрытия и переопределения методов. ваши усилия высоко оцененыне может неявно конвертировать тип customB customC

ответ

3

Вы пытаетесь присвоить BC, что неверно - это каждый случай. Попробуйте переименовать объекты, чтобы сделать его проще:

class Animal 
{ 
} 

class Dog : Animal 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Dog dog = new Dog(); 
     dog = new Animal(); // Oops ! Not possible 
    } 
} 

Dog всегда является Animal, но каждый Animal не обязательно Dog.

Ниже будет правильно, хотя:

Animal animal = new Dog(); // Possible 
animal = new Animal(); // Possible too 

Хотя в данном случае, вероятно, Animal заслуживает того, чтобы быть abstract (так что вы не смогли бы создать в первую очередь - вы должны создать конкретный класс).

+0

«Хотя в данном случае,' Animal', вероятно, заслуживает того, чтобы быть 'abstract'.» Можете ли вы назвать 'new' в классе' abstract'? – FunctionR

+0

@FunctionR Вы не можете. Я должен был упомянуть об этом. Я сказал это, потому что с классами, названными так, не имеет смысла создавать животное без указания вида. –

+0

Точно! Я знал, что BTW :) +1 для улучшения вашего ответа дальше. – FunctionR

0

Проблема заключается в том, что C имеет тип B, но B не типа C.

Это будет работать, если вы написали так:

B b = new C(); 
b = new B(); 
0

, если вы новичок в кодировании I не хочу бросать на вас технические вещи. поэтому я объясню это так.

Вы всегда можете преобразовать в 2 корпуса. 1. Объект, из которого вы конвертируете, и должен иметь предопределенный конвертер, созданный и вызываемый 2. Объект, который вы пытаетесь преобразовать из, состоит из меньшего объекта, который вы пытаетесь преобразовать.

, такие как

в жизни мы можем предположить,

Orange : Fruit 

поэтому мы можем сказать

eat((Fruit)orange) 

, потому что оранжевый состоит из более низкого класса фрукты.

однако преобразовать Fruit в Orange вы не можете сделать, потому что Orange является более сложным, чем просто фрукты, а также кто должен сказать, что это Fruit не был банан, 2 разные вещи, хотя по-прежнему фрукты

в комментарии «Все апельсины фрукты, но не все фрукты апельсины»

+0

Можете перефразировать это так: «Все апельсины - это фрукты, но не все фрукты - апельсины» – OMGtechy

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