private static bool TryConvertFromChecked <TOther>(TOther value, out sbyte result) where TOther : INumberBase <TOther> { // In order to reduce overall code duplication and improve the inlinabilty of these // methods for the corelib types we have `ConvertFrom` handle the same sign and // `ConvertTo` handle the opposite sign. However, since there is an uneven split // between signed and unsigned types, the one that handles unsigned will also // handle `Decimal`. // // That is, `ConvertFrom` for `sbyte` will handle the other signed types and // `ConvertTo` will handle the unsigned types if (typeof(TOther) == typeof(double)) { double actualValue = (double)(object)value; result = checked ((sbyte)actualValue); return(true); } else if (typeof(TOther) == typeof(Half)) { Half actualValue = (Half)(object)value; result = checked ((sbyte)actualValue); return(true); } else if (typeof(TOther) == typeof(short)) { short actualValue = (short)(object)value; result = checked ((sbyte)actualValue); return(true); } else if (typeof(TOther) == typeof(int)) { int actualValue = (int)(object)value; result = checked ((sbyte)actualValue); return(true); } else if (typeof(TOther) == typeof(long)) { long actualValue = (long)(object)value; result = checked ((sbyte)actualValue); return(true); } else if (typeof(TOther) == typeof(Int128)) { Int128 actualValue = (Int128)(object)value; result = checked ((sbyte)actualValue); return(true); } else if (typeof(TOther) == typeof(nint)) { nint actualValue = (nint)(object)value; result = checked ((sbyte)actualValue); return(true); } else if (typeof(TOther) == typeof(float)) { float actualValue = (float)(object)value; result = checked ((sbyte)actualValue); return(true); } else { result = default; return(false); } }
static bool INumberBase <long> .TryConvertFromTruncating <TOther>(TOther value, out long result) { // In order to reduce overall code duplication and improve the inlinabilty of these // methods for the corelib types we have `ConvertFrom` handle the same sign and // `ConvertTo` handle the opposite sign. However, since there is an uneven split // between signed and unsigned types, the one that handles unsigned will also // handle `Decimal`. // // That is, `ConvertFrom` for `long` will handle the other signed types and // `ConvertTo` will handle the unsigned types if (typeof(TOther) == typeof(double)) { double actualValue = (double)(object)value; result = (actualValue >= MaxValue) ? MaxValue : (actualValue <= MinValue) ? MinValue : (long)actualValue; return(true); } else if (typeof(TOther) == typeof(Half)) { Half actualValue = (Half)(object)value; result = (actualValue == Half.PositiveInfinity) ? MaxValue : (actualValue == Half.NegativeInfinity) ? MinValue : (long)actualValue; return(true); } else if (typeof(TOther) == typeof(short)) { short actualValue = (short)(object)value; result = actualValue; return(true); } else if (typeof(TOther) == typeof(int)) { int actualValue = (int)(object)value; result = actualValue; return(true); } else if (typeof(TOther) == typeof(Int128)) { Int128 actualValue = (Int128)(object)value; result = (long)actualValue; return(true); } else if (typeof(TOther) == typeof(nint)) { nint actualValue = (nint)(object)value; result = actualValue; return(true); } else if (typeof(TOther) == typeof(sbyte)) { sbyte actualValue = (sbyte)(object)value; result = actualValue; return(true); } else if (typeof(TOther) == typeof(float)) { float actualValue = (float)(object)value; result = (actualValue >= MaxValue) ? MaxValue : (actualValue <= MinValue) ? MinValue : (long)actualValue; return(true); } else { result = default; return(false); } }
static bool INumberBase <byte> .TryConvertToChecked <TOther>(byte value, [NotNullWhen(true)] out TOther result) { // In order to reduce overall code duplication and improve the inlinabilty of these // methods for the corelib types we have `ConvertFrom` handle the same sign and // `ConvertTo` handle the opposite sign. However, since there is an uneven split // between signed and unsigned types, the one that handles unsigned will also // handle `Decimal`. // // That is, `ConvertFrom` for `byte` will handle the other unsigned types and // `ConvertTo` will handle the unsigned types if (typeof(TOther) == typeof(double)) { double actualResult = value; result = (TOther)(object)actualResult; return(true); } else if (typeof(TOther) == typeof(Half)) { Half actualResult = value; result = (TOther)(object)actualResult; return(true); } else if (typeof(TOther) == typeof(short)) { short actualResult = value; result = (TOther)(object)actualResult; return(true); } else if (typeof(TOther) == typeof(int)) { int actualResult = value; result = (TOther)(object)actualResult; return(true); } else if (typeof(TOther) == typeof(long)) { long actualResult = value; result = (TOther)(object)actualResult; return(true); } else if (typeof(TOther) == typeof(Int128)) { Int128 actualResult = value; result = (TOther)(object)actualResult; return(true); } else if (typeof(TOther) == typeof(nint)) { nint actualResult = value; result = (TOther)(object)actualResult; return(true); } else if (typeof(TOther) == typeof(sbyte)) { sbyte actualResult = checked ((sbyte)value); result = (TOther)(object)actualResult; return(true); } else if (typeof(TOther) == typeof(float)) { float actualResult = value; result = (TOther)(object)actualResult; return(true); } else { result = default !;