Предполагая, что вопрос «Почему string result = class2.Field1;
умирает с NullReferenceException», я попытаюсь объяснить.
Позволяет немного переименовать классы.Допустим, BaseClass - это Vehicle, Class1 - это Car, а Class2 - это SpaceShuttle.
Итак,
BaseClass base1 = (BaseClass)class1;
//becomes
Vehicle myVehicle = (Vehicle) myCar;
Нет проблем, приведение не является даже необходимым.Автомобиль - это всегда средство передвижения.Но
Class2 class2 = base1 as Class2;
//becomes
SpaceShuttle shuttle = myVehicle as SpaceShuttle.
Здесь я говорю, что мой автомобиль - космический корабль, а на самом деле это старая Honda Civic.Компилятор замечает это и устанавливает переменную shuttle
в null, потому что это то, что оператор as
делает .Если вы спросите myVehicle
, является ли это SpaceShuttle, он ответит NO , например:
bool isShuttle = (myVehicle is SpaceShuttle); //false
Так что даже если и SpaceShuttle, и Car имеют одинаковое свойство, унаследованное отТранспортные средства, скажем, Color
или Owner
или что-то еще, это не значит, что я могу относиться к своей машине как к космическому шаттлу.