// 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
}