2012-01-30 2 views
4

Convert 클래스와 IConvertible 인터페이스가 DataRow과 어떻게 작동하는지 궁금합니다. 이 코드가있는 경우 :IConvertible 인터페이스는 DataRow와 어떻게 작동합니까?

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

Convert.ToInt32(s)에 대한 호출은 실행을 다음

((IConvertible)s).ToInt32() 

을 그래서 같은 코드의 라인이 작업을 수행하는 방법 :

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

DataRow도 객체도 IConvertible을 구현하지 않습니까?

+0

마술 변환되지 않습니다 메서드를 호출을 . 호출 한 메서드가 다른 메서드를 호출 할 수도 있지만 다른 방법입니다. – svick

답변

7

에만 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'."