OriginalGriff
Предположим, у вас есть три класса:
class A {}
class B : A { public string S { get; set ; } }
class C : B { public string S2 { get; set ; } }
Таким образом, C является производным от B, который является производным от A.
Это означает, что экземпляры обоих C & B являются экземплярами A плюс бит, и что экземпляр C также является экземпляром B. Но что а - это не в или С, А В-Не С.
A -> B -> C
Таким образом, совершенно очевидно, что вы можете назначить экземпляр B или C переменной типа A:
A a = new B();
a = new C();
Но вы не можете так что все наоборот:
B b = new C(); // Fine.
b = new A(); // ERROR!
Если бы вы могли, то у вас были бы проблемы, когда вы попытались получить доступ
b.S
потому что экземпляр A вообще не содержит переменной.
С этим - надеюсь - ясно, давайте посмотрим, что вы делаете.
return sc.MemberwiseClone();
MemberwiseClone возвращает an
object
потому что это базовый класс для
всё - все остальные классы неявно являются производными от объекта. Поэтому когда вы возвращаете SimpleClass вы должны привести этот объект к вашему классу или я мог бы сделать это:
string LetSlipTheDogsOfWar(int i)
{
object o = i; // perfectly legal, int is derived from object
return o;
}
...
string s = LetSlipTheDogsOfWar(666); // Cry Havoc!
Система справедливо жалуется, что вы делаете что-то очень опасное!
The_Unknown_Member
Ну, в этом-то и вопрос. возвращаемый объект имеет тип System.Объект. Вопрос в том, почему можно привести возвращенную систему.Объект object to SimpleClass? В этом нет никакого смысла. Система.Объект-это не Симплекс, но Симплекс-это система.Объект
Edit: может быть, компилятор делает что-то за кулисами и заставляет производный метод MemberwiseClone() возвращать объект SimpleClass в реализации? Разве это не так? Такое поведение происходит только при использовании производного метода MemberwiseClone() из SimpleClass.
OriginalGriff
Вот именно! Простой класс - это объект, поэтому он "вписывается" в переменную объекта. Но в то же время это также и Симплекс, потому что это клон симплекса.
Метод MemberwiseClone наследуется от объекта, поэтому он может возвращать только объект. Чтобы использовать его, вы должны вернуть его к фактическому типу - и если это невозможно, вы получите ошибку времени выполнения.
- "Ха! Автозамена планшета!]