236 {
237 if (
value ==
null && (typeCode == TypeCode.Empty || typeCode == TypeCode.String || typeCode == TypeCode.Object))
238 {
239 return null;
240 }
241 if (!(
value is IConvertible convertible))
242 {
243 throw new InvalidCastException(SR.InvalidCast_IConvertible);
244 }
245 return typeCode switch
246 {
247 TypeCode.Boolean => convertible.ToBoolean(provider),
248 TypeCode.Char => convertible.ToChar(provider),
249 TypeCode.SByte => convertible.ToSByte(provider),
250 TypeCode.Byte => convertible.ToByte(provider),
251 TypeCode.Int16 => convertible.ToInt16(provider),
252 TypeCode.UInt16 => convertible.ToUInt16(provider),
253 TypeCode.Int32 => convertible.ToInt32(provider),
254 TypeCode.UInt32 => convertible.ToUInt32(provider),
255 TypeCode.Int64 => convertible.ToInt64(provider),
256 TypeCode.UInt64 => convertible.ToUInt64(provider),
257 TypeCode.Single => convertible.ToSingle(provider),
258 TypeCode.Double => convertible.ToDouble(provider),
259 TypeCode.Decimal => convertible.ToDecimal(provider),
260 TypeCode.DateTime => convertible.ToDateTime(provider),
261 TypeCode.String => convertible.ToString(provider),
262 TypeCode.Object =>
value,
263 TypeCode.DBNull => throw new InvalidCastException(SR.InvalidCast_DBNull),
264 TypeCode.Empty => throw new InvalidCastException(SR.InvalidCast_Empty),
266 };
267 }