Почему базовые типы.Net Framework не содержат реализации методов IConvertible?

Базовые типы.Net Framework, такие как Int32, Int64, Boolean и т. Д. реализовать интерфейс IConvertible, но метаданные этих типов не содержат реализации методов, определенных в интерфейсе IConvertible, таких как ToByte, ToBoolean и т. д.

Я пытаюсь понять, почему базовые типы не имеют реализации метода, хотя они реализуют интерфейс IConvertible. Может ли кто-нибудь помочь в этом?

2 ответа

Решение

Присмотритесь к документации - Int32 инвентарь IConvertible явно.

Когда класс / структура реализует интерфейс явно, вы должны привести экземпляры этого типа к его интерфейсу перед вызовом этих методов

var asConvertable = (IConvertible) 3; //boxing
var someByte = asConvertible.ToByte();

Int32 и другие примитивные типы реализуют IConvertible интерфейс явно. Явная реализация интерфейса означает, что метод не отображается в открытых методах конкретного типа: вы не можете вызывать его напрямую, вам нужно сначала привести к интерфейсу.

int x = 42;
IConvertible c = (IConvertible)x;
byte b = c.ToByte();

Чтобы реализовать интерфейс явно, вы не указываете уровень доступности, а перед именем метода добавляется имя интерфейса:

byte IConvertible.ToByte()
{
    ...
}

Чтобы получить доступ к методу с помощью отражения, вы должны указать полное имя интерфейса:

MethodInfo toByte =
    typeof(int).GetMethod("System.IConvertible.ToByte",
                          BindingFlags.Instance | BindingFlags.NonPublic);
Другие вопросы по тегам