Из книги CLR через C # вы можете найти другую причину использования EIMI: безопасность типов и избегание бокса
Например, вы реализовали интерфейс IComparable:
struct SomeValueType1 : IComparable
{
private int _v;
public SomeValueType1(int v)
{
_v = v;
}
public int CompareTo(object obj)
{
return _v - ((SomeValueType1)obj)._v;
}
}
Посмотрите на реализацию метода CompareTo:
Не является безопасным типом. В качестве параметра он получает объект. Если тип объекта не будет SomeValueType1 - он потерпит крах во время выполнения
Использование:
SomeValueType1 svt1 = new SomeValueType1(0);
Object o1 = new Object();
Int32 res = svt1.CompareTo(svt1);
res = svt1.CompareTo(o1);
Третья строка делает бокс из svt1 в Object. 4-я строка выдаст ошибку времени выполнения
Позволяет использовать EIMI:
struct SomeValueType2 : IComparable
{
private int _v;
public SomeValueType2(int v)
{
_v = v;
}
public int CompareTo(SomeValueType2 svt2)
{
return _v - svt2._v;
}
int IComparable.CompareTo(object obj)
{
return CompareTo((SomeValueType2)obj);
}
}
Использование:
SomeValueType2 svt2 = new SomeValueType2(0);
Object o2 = new Object();
res = svt2.CompareTo(svt2);
res = svt2.CompareTo(o2);
Третья строчка не занимайся боксом! 4-я строка выдаст ошибку времени компиляции
Как писал Джеффри Рихтер в CLR через C # 4-е издание: «Эта дискуссия ясно показывает вам, что EIMI следует использовать с большой осторожностью. Когда многие разработчики впервые узнают об EIMI, они думают, что они крутые и начинают использовать когда это возможно. Не делайте этого! EIMI полезны в некоторых обстоятельствах, но вы должны избегать их, когда это возможно, потому что они делают использование типа очень
сложнее. "
Удачи!