Типы значений не являются LSP-подтипами объекта до тех пор, пока они не упакованы.
Дисперсия не работает с типами значений.Вообще.
Демонстрация того, что int
не является надлежащим подтипом (подтип в смысле LSP) object
:
Работает:
object x = new object();
lock (x) { ... }
Не работает (нарушена замещаемость):
int y = new int();
lock (y) { ... }
Возвращает true:
object x = new object();
object a = x;
object b = x;
return ReferenceEquals(a, b);
Возвращает false (заменяемость нарушена):
int y = new int();
object a = y;
object b = y;
return ReferenceEquals(a, b);
Конечно, тема вопроса (разница в интерфейсе) является третьей демонстрацией.