Как интерфейс IConvertible работает с DataRow? - PullRequest
4 голосов
/ 30 января 2012

Мне просто интересно, как класс Convert и интерфейс IConvertible работают с DataRow.Если у меня есть этот код:

string s="25";
int x= Convert.ToInt32(s);

При вызове Convert.ToInt32(s) будет выполнено следующее:

((IConvertible)s).ToInt32()

Итак, как это работает с такой строкой кода:

Convert.ToInt32(myDataRow["intField"]);

Когда ни DataRow, ни объект не реализуют IConvertible?

1 Ответ

8 голосов
/ 30 января 2012

Поля DataRow представляются как объекты, поэтому вызывается Convert.ToInt32(object value), что в точности соответствует тому, что вы сказали в своем вопросе:

return value == null? 0: ((IConvertible)value).ToInt32(null);

Среда выполнения пытается выполнить преобразование из object до IConvertible.Неважно, что object не реализует интерфейс;важно то, что какой-либо конкретный конкретный тип в DataRow во время выполнения должен реализовывать интерфейс.Все встроенные базовые типы CLR реализуют, например, IConvertible, поэтому он будет вызывать String.ToInt32() или Boolean.ToInt32() или что-то еще.Интерфейсы реализованы в явном виде, поэтому вы не можете вызывать эти методы напрямую по своему собственному string или bool, но вы можете выполнить повышение до IConvertible и сделать это.

object s = new System.String('1', 3);
var i = Convert.ToInt32(s);

// s = "111"; i = 111

Если вы попытаетесьчтобы запустить этот метод на объекте, который не реализует IConvertible, вы получите исключение при типизации во время выполнения:

var o = new object();
var x2 = Convert.ToInt32(o);

// throws System.InvalidCastException: "Unable to cast object of type 'System.Object' to type 'System.IConvertible'."
...