Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -87,50 +87,14 @@ public override string Message
// Gets the value of the argument that caused the exception.
public virtual object? ActualValue => _actualValue;

[DoesNotReturn]
private static void ThrowZero<T>(T value, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeNonZero, paramName, value));

[DoesNotReturn]
private static void ThrowNegative<T>(T value, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeNonNegative, paramName, value));

[DoesNotReturn]
private static void ThrowNegativeOrZero<T>(T value, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeNonNegativeNonZero, paramName, value));

[DoesNotReturn]
private static void ThrowGreater<T>(T value, T other, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeLessOrEqual, paramName, value, other));

[DoesNotReturn]
private static void ThrowGreaterEqual<T>(T value, T other, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeLess, paramName, value, other));

[DoesNotReturn]
private static void ThrowLess<T>(T value, T other, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeGreaterOrEqual, paramName, value, other));

[DoesNotReturn]
private static void ThrowLessEqual<T>(T value, T other, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeGreater, paramName, value, other));

[DoesNotReturn]
private static void ThrowEqual<T>(T value, T other, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeNotEqual, paramName, (object?)value ?? "null", (object?)other ?? "null"));

[DoesNotReturn]
private static void ThrowNotEqual<T>(T value, T other, string? paramName) =>
throw new ArgumentOutOfRangeException(paramName, value, SR.Format(SR.ArgumentOutOfRange_Generic_MustBeEqual, paramName, (object?)value ?? "null", (object?)other ?? "null"));

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is zero.</summary>
/// <param name="value">The argument to validate as non-zero.</param>
/// <param name="paramName">The name of the parameter with which <paramref name="value"/> corresponds.</param>
public static void ThrowIfZero<T>(T value, [CallerArgumentExpression(nameof(value))] string? paramName = null)
where T : INumberBase<T>
{
if (T.IsZero(value))
ThrowZero(value, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeNonZero(value, paramName);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is negative.</summary>
Expand All @@ -140,7 +104,7 @@ public static void ThrowIfNegative<T>(T value, [CallerArgumentExpression(nameof(
where T : INumberBase<T>
{
if (T.IsNegative(value))
ThrowNegative(value, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeNonNegative(value, paramName);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is negative or zero.</summary>
Expand All @@ -150,7 +114,7 @@ public static void ThrowIfNegativeOrZero<T>(T value, [CallerArgumentExpression(n
where T : INumberBase<T>
{
if (T.IsNegative(value) || T.IsZero(value))
ThrowNegativeOrZero(value, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeNonNegativeNonZero(value, paramName);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is equal to <paramref name="other"/>.</summary>
Expand All @@ -160,7 +124,7 @@ public static void ThrowIfNegativeOrZero<T>(T value, [CallerArgumentExpression(n
public static void ThrowIfEqual<T>(T value, T other, [CallerArgumentExpression(nameof(value))] string? paramName = null) where T : IEquatable<T>?
{
if (EqualityComparer<T>.Default.Equals(value, other))
ThrowEqual(value, other, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeNotEqual(value, other, paramName);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is not equal to <paramref name="other"/>.</summary>
Expand All @@ -170,7 +134,7 @@ public static void ThrowIfEqual<T>(T value, T other, [CallerArgumentExpression(n
public static void ThrowIfNotEqual<T>(T value, T other, [CallerArgumentExpression(nameof(value))] string? paramName = null) where T : IEquatable<T>?
{
if (!EqualityComparer<T>.Default.Equals(value, other))
ThrowNotEqual(value, other, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeEqual(value, other, paramName);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is greater than <paramref name="other"/>.</summary>
Expand All @@ -181,7 +145,7 @@ public static void ThrowIfGreaterThan<T>(T value, T other, [CallerArgumentExpres
where T : IComparable<T>
{
if (value.CompareTo(other) > 0)
ThrowGreater(value, other, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeLessOrEqual(value, other, paramName);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is greater than or equal <paramref name="other"/>.</summary>
Expand All @@ -192,7 +156,7 @@ public static void ThrowIfGreaterThanOrEqual<T>(T value, T other, [CallerArgumen
where T : IComparable<T>
{
if (value.CompareTo(other) >= 0)
ThrowGreaterEqual(value, other, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeLess(value, other, paramName);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is less than <paramref name="other"/>.</summary>
Expand All @@ -203,7 +167,7 @@ public static void ThrowIfLessThan<T>(T value, T other, [CallerArgumentExpressio
where T : IComparable<T>
{
if (value.CompareTo(other) < 0)
ThrowLess(value, other, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeGreaterOrEqual(value, other, paramName);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is less than or equal <paramref name="other"/>.</summary>
Expand All @@ -214,7 +178,7 @@ public static void ThrowIfLessThanOrEqual<T>(T value, T other, [CallerArgumentEx
where T : IComparable<T>
{
if (value.CompareTo(other) <= 0)
ThrowLessEqual(value, other, paramName);
ThrowHelper.ThrowArgumentOutOfRange_Generic_MustBeGreater(value, other, paramName);
}
}
}
71 changes: 71 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,77 @@ internal static void ThrowArgumentOutOfRange_Range<T>(string parameterName, T va
throw new ArgumentOutOfRangeException(parameterName, value, SR.Format(SR.ArgumentOutOfRange_Range, minInclusive, maxInclusive));
}

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeNonZero<T>(T value, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeNonZero(paramName, value);

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeNonNegative<T>(T value, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeNonNegative(paramName, value);

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeNonNegativeNonZero<T>(T value, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeNonNegativeNonZero(paramName, value);

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeLessOrEqual<T>(T value, T other, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeLessOrEqual(paramName, value, other);

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeLess<T>(T value, T other, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeLess(paramName, value, other);

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeGreaterOrEqual<T>(T value, T other, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeGreaterOrEqual(paramName, value, other);

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeGreater<T>(T value, T other, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeGreater(paramName, value, other);

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeNotEqual<T>(T value, T other, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeNotEqual(paramName, value, other);

[DoesNotReturn]
internal static void ThrowArgumentOutOfRange_Generic_MustBeEqual<T>(T value, T other, string? paramName) =>
throw GetArgumentOutOfRange_Generic_MustBeEqual(paramName, value, other);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeNonZero(string? paramName, object? value) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeNonZero, value, paramName);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeNonNegative(string? paramName, object? value) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeNonNegative, value, paramName);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeNonNegativeNonZero(string? paramName, object? value) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeNonNegativeNonZero, value, paramName);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeLessOrEqual(string? paramName, object? value, object? other) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeLessOrEqual, value, other, paramName);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeLess(string? paramName, object? value, object? other) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeLess, value, other, paramName);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeGreaterOrEqual(string? paramName, object? value, object? other) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeGreaterOrEqual, value, other, paramName);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeGreater(string? paramName, object? value, object? other) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeGreater, value, other, paramName);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeNotEqual(string? paramName, object? value, object? other) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeNotEqual, value, other, paramName);

private static ArgumentOutOfRangeException GetArgumentOutOfRange_Generic_MustBeEqual(string? paramName, object? value, object? other) =>
GetArgumentOutOfRangeException(SR.ArgumentOutOfRange_Generic_MustBeEqual, value, other, paramName);

[MethodImpl(MethodImplOptions.NoInlining)]
private static ArgumentOutOfRangeException GetArgumentOutOfRangeException(string resourceFormat, object? value, string? paramName) =>
new ArgumentOutOfRangeException(paramName, value, string.Format(resourceFormat, paramName, value));

[MethodImpl(MethodImplOptions.NoInlining)]
private static ArgumentOutOfRangeException GetArgumentOutOfRangeException(string resourceFormat, object? value, object? other, string? paramName) =>
new ArgumentOutOfRangeException(paramName, value, string.Format(resourceFormat, paramName, value ?? "null", other ?? "null"));

[DoesNotReturn]
internal static void ThrowOverflowException()
{
Expand Down
Loading