// Copyright (c) Microsoft. All rights reserved. #pragma warning disable IDE0005 // Using directive is unnecessary. using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; namespace Microsoft.Shared.Diagnostics; /// /// Defines static methods used to throw exceptions. /// /// /// The main purpose is to reduce code size, improve performance, and standardize exception /// messages. /// [ExcludeFromCodeCoverage] internal static partial class Throw { #region For Object /// /// Throws an if the specified argument is . /// /// Argument type to be checked for . /// Object to be checked for . /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] [return: NotNull] public static T IfNull([NotNull] T argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument is null) { ArgumentNullException(paramName); } return argument; } /// /// Throws an if the specified argument is , /// or if the specified member is . /// /// Argument type to be checked for . /// Member type to be checked for . /// Argument to be checked for . /// Object member to be checked for . /// The name of the parameter being checked. /// The name of the member. /// The original value of . /// /// /// Throws.IfNullOrMemberNull(myObject, myObject?.MyProperty) /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] [return: NotNull] public static TMember IfNullOrMemberNull( [NotNull] TParameter argument, [NotNull] TMember member, [CallerArgumentExpression(nameof(argument))] string paramName = "", [CallerArgumentExpression(nameof(member))] string memberName = "") { if (argument is null) { ArgumentNullException(paramName); } if (member is null) { ArgumentException(paramName, $"Member {memberName} of {paramName} is null"); } return member; } /// /// Throws an if the specified member is . /// /// Argument type. /// Member type to be checked for . /// Argument to which member belongs. /// Object member to be checked for . /// The name of the parameter being checked. /// The name of the member. /// The original value of . /// /// /// Throws.IfMemberNull(myObject, myObject.MyProperty) /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] [return: NotNull] [SuppressMessage("Style", "IDE0060:Remove unused parameter", Justification = "Analyzer isn't seeing the reference to 'argument' in the attribute")] public static TMember IfMemberNull( TParameter argument, [NotNull] TMember member, [CallerArgumentExpression(nameof(argument))] string paramName = "", [CallerArgumentExpression(nameof(member))] string memberName = "") where TParameter : notnull { if (member is null) { ArgumentException(paramName, $"Member {memberName} of {paramName} is null"); } return member; } #endregion #region For String /// /// Throws either an or an /// if the specified string is or whitespace respectively. /// /// String to be checked for or whitespace. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] [return: NotNull] public static string IfNullOrWhitespace([NotNull] string? argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { #if !NETCOREAPP3_1_OR_GREATER if (argument == null) { ArgumentNullException(paramName); } #endif if (string.IsNullOrWhiteSpace(argument)) { if (argument == null) { ArgumentNullException(paramName); } else { ArgumentException(paramName, "Argument is whitespace"); } } return argument; } /// /// Throws an if the string is , /// or if it is empty. /// /// String to be checked for or empty. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] [return: NotNull] public static string IfNullOrEmpty([NotNull] string? argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { #if !NETCOREAPP3_1_OR_GREATER if (argument == null) { ArgumentNullException(paramName); } #endif if (string.IsNullOrEmpty(argument)) { if (argument == null) { ArgumentNullException(paramName); } else { ArgumentException(paramName, "Argument is an empty string"); } } return argument; } #endregion #region For Buffer /// /// Throws an if the argument's buffer size is less than the required buffer size. /// /// The actual buffer size. /// The required buffer size. /// The name of the parameter to be checked. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void IfBufferTooSmall(int bufferSize, int requiredSize, string paramName = "") { if (bufferSize < requiredSize) { ArgumentException(paramName, $"Buffer too small, needed a size of {requiredSize} but got {bufferSize}"); } } #endregion #region For Enums /// /// Throws an if the enum value is not valid. /// /// The argument to evaluate. /// The name of the parameter being checked. /// The type of the enumeration. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T IfOutOfRange(T argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") where T : struct, Enum { #if NET5_0_OR_GREATER if (!Enum.IsDefined(argument)) #else if (!Enum.IsDefined(typeof(T), argument)) #endif { ArgumentOutOfRangeException(paramName, $"{argument} is an invalid value for enum type {typeof(T)}"); } return argument; } #endregion #region For Collections /// /// Throws an if the collection is , /// or if it is empty. /// /// The collection to evaluate. /// The name of the parameter being checked. /// The type of objects in the collection. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] [return: NotNull] // The method has actually 100% coverage, but due to a bug in the code coverage tool, // a lower number is reported. Therefore, we temporarily exclude this method // from the coverage measurements. Once the bug in the code coverage tool is fixed, // the exclusion attribute can be removed. [ExcludeFromCodeCoverage] public static IEnumerable IfNullOrEmpty([NotNull] IEnumerable? argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument == null) { ArgumentNullException(paramName); } else { switch (argument) { case ICollection collection: if (collection.Count == 0) { ArgumentException(paramName, "Collection is empty"); } break; case IReadOnlyCollection readOnlyCollection: if (readOnlyCollection.Count == 0) { ArgumentException(paramName, "Collection is empty"); } break; default: using (IEnumerator enumerator = argument.GetEnumerator()) { if (!enumerator.MoveNext()) { ArgumentException(paramName, "Collection is empty"); } } break; } } return argument; } #endregion #region Exceptions /// /// Throws an . /// /// The name of the parameter that caused the exception. #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void ArgumentNullException(string paramName) => throw new ArgumentNullException(paramName); /// /// Throws an . /// /// The name of the parameter that caused the exception. /// A message that describes the error. #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void ArgumentNullException(string paramName, string? message) => throw new ArgumentNullException(paramName, message); /// /// Throws an . /// /// The name of the parameter that caused the exception. #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void ArgumentOutOfRangeException(string paramName) => throw new ArgumentOutOfRangeException(paramName); /// /// Throws an . /// /// The name of the parameter that caused the exception. /// A message that describes the error. #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void ArgumentOutOfRangeException(string paramName, string? message) => throw new ArgumentOutOfRangeException(paramName, message); /// /// Throws an . /// /// The name of the parameter that caused the exception. /// The value of the argument that caused this exception. /// A message that describes the error. #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void ArgumentOutOfRangeException(string paramName, object? actualValue, string? message) => throw new ArgumentOutOfRangeException(paramName, actualValue, message); /// /// Throws an . /// /// The name of the parameter that caused the exception. /// A message that describes the error. #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void ArgumentException(string paramName, string? message) => throw new ArgumentException(message, paramName); /// /// Throws an . /// /// The name of the parameter that caused the exception. /// A message that describes the error. /// The exception that is the cause of the current exception. /// /// If the is not a , the current exception is raised in a catch /// block that handles the inner exception. /// #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void ArgumentException(string paramName, string? message, Exception? innerException) => throw new ArgumentException(message, paramName, innerException); /// /// Throws an . /// /// A message that describes the error. #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void InvalidOperationException(string message) => throw new InvalidOperationException(message); /// /// Throws an . /// /// A message that describes the error. /// The exception that is the cause of the current exception. #if !NET6_0_OR_GREATER [MethodImpl(MethodImplOptions.NoInlining)] #endif [DoesNotReturn] public static void InvalidOperationException(string message, Exception? innerException) => throw new InvalidOperationException(message, innerException); #endregion #region For Integer /// /// Throws an if the specified number is less than min. /// /// Number to be expected being less than min. /// The number that must be less than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IfLessThan(int argument, int min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument < min) { ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater than max. /// /// Number to be expected being greater than max. /// The number that must be greater than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IfGreaterThan(int argument, int max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument > max) { ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is less or equal than min. /// /// Number to be expected being less or equal than min. /// The number that must be less or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IfLessThanOrEqual(int argument, int min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument <= min) { ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater or equal than max. /// /// Number to be expected being greater or equal than max. /// The number that must be greater or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IfGreaterThanOrEqual(int argument, int max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument >= max) { ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is not in the specified range. /// /// Number to be expected being greater or equal than max. /// The lower bound of the allowed range of argument values. /// The upper bound of the allowed range of argument values. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IfOutOfRange(int argument, int min, int max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument < min || argument > max) { ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]"); } return argument; } /// /// Throws an if the specified number is equal to 0. /// /// Number to be expected being not equal to zero. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int IfZero(int argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument == 0) { ArgumentOutOfRangeException(paramName, "Argument is zero"); } return argument; } #endregion #region For Unsigned Integer /// /// Throws an if the specified number is less than min. /// /// Number to be expected being less than min. /// The number that must be less than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint IfLessThan(uint argument, uint min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument < min) { ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater than max. /// /// Number to be expected being greater than max. /// The number that must be greater than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint IfGreaterThan(uint argument, uint max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument > max) { ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is less or equal than min. /// /// Number to be expected being less or equal than min. /// The number that must be less or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint IfLessThanOrEqual(uint argument, uint min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument <= min) { ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater or equal than max. /// /// Number to be expected being greater or equal than max. /// The number that must be greater or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint IfGreaterThanOrEqual(uint argument, uint max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument >= max) { ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is not in the specified range. /// /// Number to be expected being greater or equal than max. /// The lower bound of the allowed range of argument values. /// The upper bound of the allowed range of argument values. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint IfOutOfRange(uint argument, uint min, uint max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument < min || argument > max) { ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]"); } return argument; } /// /// Throws an if the specified number is equal to 0. /// /// Number to be expected being not equal to zero. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint IfZero(uint argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument == 0U) { ArgumentOutOfRangeException(paramName, "Argument is zero"); } return argument; } #endregion #region For Long /// /// Throws an if the specified number is less than min. /// /// Number to be expected being less than min. /// The number that must be less than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long IfLessThan(long argument, long min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument < min) { ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater than max. /// /// Number to be expected being greater than max. /// The number that must be greater than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long IfGreaterThan(long argument, long max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument > max) { ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is less or equal than min. /// /// Number to be expected being less or equal than min. /// The number that must be less or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long IfLessThanOrEqual(long argument, long min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument <= min) { ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater or equal than max. /// /// Number to be expected being greater or equal than max. /// The number that must be greater or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long IfGreaterThanOrEqual(long argument, long max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument >= max) { ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is not in the specified range. /// /// Number to be expected being greater or equal than max. /// The lower bound of the allowed range of argument values. /// The upper bound of the allowed range of argument values. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long IfOutOfRange(long argument, long min, long max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument < min || argument > max) { ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]"); } return argument; } /// /// Throws an if the specified number is equal to 0. /// /// Number to be expected being not equal to zero. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long IfZero(long argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument == 0L) { ArgumentOutOfRangeException(paramName, "Argument is zero"); } return argument; } #endregion #region For Unsigned Long /// /// Throws an if the specified number is less than min. /// /// Number to be expected being less than min. /// The number that must be less than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong IfLessThan(ulong argument, ulong min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument < min) { ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater than max. /// /// Number to be expected being greater than max. /// The number that must be greater than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong IfGreaterThan(ulong argument, ulong max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument > max) { ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is less or equal than min. /// /// Number to be expected being less or equal than min. /// The number that must be less or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong IfLessThanOrEqual(ulong argument, ulong min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument <= min) { ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater or equal than max. /// /// Number to be expected being greater or equal than max. /// The number that must be greater or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong IfGreaterThanOrEqual(ulong argument, ulong max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument >= max) { ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is not in the specified range. /// /// Number to be expected being greater or equal than max. /// The lower bound of the allowed range of argument values. /// The upper bound of the allowed range of argument values. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong IfOutOfRange(ulong argument, ulong min, ulong max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument < min || argument > max) { ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]"); } return argument; } /// /// Throws an if the specified number is equal to 0. /// /// Number to be expected being not equal to zero. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong IfZero(ulong argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { if (argument == 0UL) { ArgumentOutOfRangeException(paramName, "Argument is zero"); } return argument; } #endregion #region For Double /// /// Throws an if the specified number is less than min. /// /// Number to be expected being less than min. /// The number that must be less than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double IfLessThan(double argument, double min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { // strange conditional needed in order to handle NaN values correctly #pragma warning disable S1940 // Boolean checks should not be inverted if (!(argument >= min)) #pragma warning restore S1940 // Boolean checks should not be inverted { ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater than max. /// /// Number to be expected being greater than max. /// The number that must be greater than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double IfGreaterThan(double argument, double max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { // strange conditional needed in order to handle NaN values correctly #pragma warning disable S1940 // Boolean checks should not be inverted if (!(argument <= max)) #pragma warning restore S1940 // Boolean checks should not be inverted { ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is less or equal than min. /// /// Number to be expected being less or equal than min. /// The number that must be less or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double IfLessThanOrEqual(double argument, double min, [CallerArgumentExpression(nameof(argument))] string paramName = "") { // strange conditional needed in order to handle NaN values correctly #pragma warning disable S1940 // Boolean checks should not be inverted if (!(argument > min)) #pragma warning restore S1940 // Boolean checks should not be inverted { ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}"); } return argument; } /// /// Throws an if the specified number is greater or equal than max. /// /// Number to be expected being greater or equal than max. /// The number that must be greater or equal than the argument. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double IfGreaterThanOrEqual(double argument, double max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { // strange conditional needed in order to handle NaN values correctly #pragma warning disable S1940 // Boolean checks should not be inverted if (!(argument < max)) #pragma warning restore S1940 // Boolean checks should not be inverted { ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}"); } return argument; } /// /// Throws an if the specified number is not in the specified range. /// /// Number to be expected being greater or equal than max. /// The lower bound of the allowed range of argument values. /// The upper bound of the allowed range of argument values. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double IfOutOfRange(double argument, double min, double max, [CallerArgumentExpression(nameof(argument))] string paramName = "") { // strange conditional needed in order to handle NaN values correctly if (!(min <= argument && argument <= max)) { ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]"); } return argument; } /// /// Throws an if the specified number is equal to 0. /// /// Number to be expected being not equal to zero. /// The name of the parameter being checked. /// The original value of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double IfZero(double argument, [CallerArgumentExpression(nameof(argument))] string paramName = "") { #pragma warning disable S1244 // Floating point numbers should not be tested for equality if (argument == 0.0) #pragma warning restore S1244 // Floating point numbers should not be tested for equality { ArgumentOutOfRangeException(paramName, "Argument is zero"); } return argument; } #endregion }