static bool INumberBase <short> .TryConvertFromTruncating <TOther>(TOther value, out short 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 `short` 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 : (short)actualValue; return(true); } else if (typeof(TOther) == typeof(Half)) { Half actualValue = (Half)(object)value; result = (actualValue >= BitConverter.UInt16BitsToHalf(0x7800)) ? MaxValue : (actualValue <= BitConverter.UInt16BitsToHalf(0xF800)) ? MinValue : (short)actualValue; return(true); } else if (typeof(TOther) == typeof(int)) { int actualValue = (int)(object)value; result = (short)actualValue; return(true); } else if (typeof(TOther) == typeof(long)) { long actualValue = (long)(object)value; result = (short)actualValue; return(true); } else if (typeof(TOther) == typeof(Int128)) { Int128 actualValue = (Int128)(object)value; result = (short)actualValue; return(true); } else if (typeof(TOther) == typeof(nint)) { nint actualValue = (nint)(object)value; result = (short)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 : (short)actualValue; return(true); } else { result = default; return(false); } }