2010-10-03 24 views
5

Klasa Convert istnieje od .NET 1.0. Interfejs IConvertible również istnieje od tego czasu.Dlaczego parametr Convert.ChangeType przyjmuje parametr obiektu?

Sposób Convert.ChangeTypetylko prace na obiektach typu, które wdrażają IConvertible (w rzeczywistości, o ile się nie mylę, wszystko z metod konwersji dostarczonych przez klasę Convert są w ten sposób). Dlaczego więc jest typ parametru object?

Innymi słowy, zamiast tego:

public object ChangeType(object value, Type conversionType); 

Dlaczego nie jest ten podpis?

public object ChangeType(IConvertible value, Type conversionType); 

Po prostu wydaje mi się to dziwne.

Odpowiedz

5

Patrząc w reflektorze można zobaczyć szczyt ChangeType(object, Type, IFormatProvider), czyli czegoś, co nazywa się pod kołdrę:

public static object ChangeType(object value, Type conversionType, IFormatProvider provider) 
{ 
    //a few null checks... 
    IConvertible convertible = value as IConvertible; 
    if (convertible == null) 
    { 
    if (value.GetType() != conversionType) 
    { 
     throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible")); 
    } 
    return value; 
    } 

więc wygląda na to obiekt typu że nie realizacji IConvertible ale już jest typ docelowy po prostu zwróci oryginalny obiekt.

prawda wygląda to tylko wyjątek do wartości, która chciałaby wdrożyć IConvertible, ale jest to wyjątek, a wygląda powodu parametr jest object zamiast.


Oto szybki test LINQPad w tym przypadku:

void Main() 
{ 
    var t = new Test(); 
    var u = Convert.ChangeType(t, typeof(Test)); 
    (u is IConvertible).Dump(); //false, for demonstration only 
    u.Dump();      //dump of a value Test object 
} 

public class Test { 
    public string Bob; 
} 
+0

myślę, że to wydaje się być jedynym możliwym wyjaśnieniem ... nie wydaje się wam dziwne, mimo, że projektanci zastanawiałabym się, czy zachowanie "może wziąć obiekt i przekonwertować go na ten sam typ" nawet warte wsparcia? Chodzi mi o to, do czego byłby on kiedykolwiek użyty? –

+0

@Dan - Myślę, że ObjectDatasource używa go wewnętrznie IIRC, myślę, że woleli sprawdzić wewnątrz zamiast jednego na zewnątrz? Zgadzam się, że nie wydaje się to zbyt przydatne. –

Powiązane problemy