Skip to content

Add ArgumentOutOfRangeException.ThrowIf{Not}Equal #83853

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 6, 2023
Merged
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 @@ -58,8 +58,7 @@ public static unsafe void LoadInMemoryAssemblyInContext(IntPtr moduleHandle, Int
if (!IsSupported)
throw new NotSupportedException(SR.NotSupported_CppCli);

if (loadContext != IntPtr.Zero)
throw new ArgumentOutOfRangeException(nameof(loadContext));
ArgumentOutOfRangeException.ThrowIfNotEqual(loadContext, IntPtr.Zero);

LoadInMemoryAssemblyInContextImpl(moduleHandle, assemblyPath, AssemblyLoadContext.Default);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -396,9 +396,6 @@
<data name="ArgumentCannotBeOfTypeVoid" xml:space="preserve">
<value>Argument type cannot be System.Void.</value>
</data>
<data name="OutOfRange" xml:space="preserve">
<value>{0} must be greater than or equal to {1}</value>
</data>
<data name="LabelTargetAlreadyDefined" xml:space="preserve">
<value>Cannot redefine label '{0}' in an inner block.</value>
</data>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,9 @@ public sealed override Expression Bind(object[] args, ReadOnlyCollection<Paramet
ArgumentNullException.ThrowIfNull(args);
ArgumentNullException.ThrowIfNull(parameters);
ArgumentNullException.ThrowIfNull(returnLabel);
if (args.Length == 0)
{
throw System.Linq.Expressions.Error.OutOfRange("args.Length", 1);
}
if (parameters.Count == 0)
{
throw System.Linq.Expressions.Error.OutOfRange("parameters.Count", 1);
}
if (args.Length != parameters.Count)
{
throw new ArgumentOutOfRangeException(nameof(args));
}
ArgumentOutOfRangeException.ThrowIfZero(args.Length);
ArgumentOutOfRangeException.ThrowIfZero(parameters.Count);
ArgumentOutOfRangeException.ThrowIfNotEqual(args.Length, parameters.Count);

// Ensure that the binder's ReturnType matches CallSite's return
// type. We do this so meta objects and language binders can
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,22 +179,10 @@ public static DebugInfoExpression ClearDebugInfo(SymbolDocumentInfo document)

private static void ValidateSpan(int startLine, int startColumn, int endLine, int endColumn)
{
if (startLine < 1)
{
throw Error.OutOfRange(nameof(startLine), 1);
}
if (startColumn < 1)
{
throw Error.OutOfRange(nameof(startColumn), 1);
}
if (endLine < 1)
{
throw Error.OutOfRange(nameof(endLine), 1);
}
if (endColumn < 1)
{
throw Error.OutOfRange(nameof(endColumn), 1);
}
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(startLine);
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(startColumn);
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(endLine);
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(endColumn);
if (startLine > endLine)
{
throw Error.StartEndMustBeOrdered();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1006,13 +1006,6 @@ internal static ArgumentException ArgumentCannotBeOfTypeVoid(string? paramName)
return new ArgumentException(Strings.ArgumentCannotBeOfTypeVoid, paramName);
}
/// <summary>
/// ArgumentOutOfRangeException with message like "{0} must be greater than or equal to {1}"
/// </summary>
internal static ArgumentException OutOfRange(string? paramName, object? p1)
{
return new ArgumentOutOfRangeException(paramName, Strings.OutOfRange(paramName, p1));
}
/// <summary>
/// InvalidOperationException with message like "Cannot redefine label '{0}' in an inner block."
/// </summary>
internal static InvalidOperationException LabelTargetAlreadyDefined(object? p0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -643,11 +643,6 @@ internal static class Strings
/// </summary>
internal static string ArgumentCannotBeOfTypeVoid => SR.ArgumentCannotBeOfTypeVoid;

/// <summary>
/// A string like "{0} must be greater than or equal to {1}"
/// </summary>
internal static string OutOfRange(object? p0, object? p1) => SR.Format(SR.OutOfRange, p0, p1);

/// <summary>
/// A string like "Cannot redefine label '{0}' in an inner block."
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,11 +328,7 @@ public object? this[int index]
{
get
{
if (index != 0)
{
throw new ArgumentOutOfRangeException(nameof(index));
}

ArgumentOutOfRangeException.ThrowIfNotEqual(index, 0);
return _item;
}
set => throw new NotSupportedException(SR.NotSupported_ReadOnlyCollection);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,7 @@ public static unsafe int LoadAssemblyAndGetFunctionPointer(IntPtr assemblyPathNa
string typeName = MarshalToString(typeNameNative, nameof(typeNameNative));
string methodName = MarshalToString(methodNameNative, nameof(methodNameNative));

if (reserved != IntPtr.Zero)
{
throw new ArgumentOutOfRangeException(nameof(reserved));
}

ArgumentOutOfRangeException.ThrowIfNotEqual(reserved, IntPtr.Zero);
ArgumentNullException.ThrowIfNull(functionHandle);

// Set up the AssemblyLoadContext for this delegate.
Expand Down Expand Up @@ -119,15 +115,8 @@ public static unsafe int LoadAssembly(IntPtr assemblyPathNative, IntPtr loadCont
{
string assemblyPath = MarshalToString(assemblyPathNative, nameof(assemblyPathNative));

if (loadContext != IntPtr.Zero)
{
throw new ArgumentOutOfRangeException(nameof(loadContext));
}

if (reserved != IntPtr.Zero)
{
throw new ArgumentOutOfRangeException(nameof(reserved));
}
ArgumentOutOfRangeException.ThrowIfNotEqual(loadContext, IntPtr.Zero);
ArgumentOutOfRangeException.ThrowIfNotEqual(reserved, IntPtr.Zero);

LoadAssemblyLocal(assemblyPath);
}
Expand Down Expand Up @@ -215,16 +204,8 @@ public static unsafe int GetFunctionPointer(IntPtr typeNameNative,
string typeName = MarshalToString(typeNameNative, nameof(typeNameNative));
string methodName = MarshalToString(methodNameNative, nameof(methodNameNative));

if (loadContext != IntPtr.Zero)
{
throw new ArgumentOutOfRangeException(nameof(loadContext));
}

if (reserved != IntPtr.Zero)
{
throw new ArgumentOutOfRangeException(nameof(reserved));
}

ArgumentOutOfRangeException.ThrowIfNotEqual(loadContext, IntPtr.Zero);
ArgumentOutOfRangeException.ThrowIfNotEqual(reserved, IntPtr.Zero);
ArgumentNullException.ThrowIfNull(functionHandle);

#pragma warning disable IL2026 // suppressed in ILLink.Suppressions.LibraryBuild.xml
Expand Down
20 changes: 13 additions & 7 deletions src/libraries/System.Private.CoreLib/src/Resources/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -1926,25 +1926,31 @@
<value>Year must be between 1 and 9999.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeNonZero" xml:space="preserve">
<value>'{0}' must be a non-zero value.</value>
<value>{0} ('{1}') must be a non-zero value.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeNonNegative" xml:space="preserve">
<value>'{0}' must be a non-negative value.</value>
<value>{0} ('{1}') must be a non-negative value.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeNonNegativeNonZero" xml:space="preserve">
<value>'{0}' must be a non-negative and non-zero value.</value>
<value>{0} ('{1}') must be a non-negative and non-zero value.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeLessOrEqual" xml:space="preserve">
<value>'{0}' must be less than or equal to '{1}'.</value>
<value>{0} ('{1}') must be less than or equal to '{2}'.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeLess" xml:space="preserve">
<value>'{0}' must be less than '{1}'.</value>
<value>{0} ('{1}') must be less than '{2}'.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeGreaterOrEqual" xml:space="preserve">
<value>'{0}' must be greater than or equal to '{1}'.</value>
<value>{0} ('{1}') must be greater than or equal to '{2}'.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeGreater" xml:space="preserve">
<value>'{0}' must be greater than '{1}'.</value>
<value>{0} ('{1}') must be greater than '{2}'.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeEqual" xml:space="preserve">
<value>{0} ('{1}') must be equal to '{2}'.</value>
</data>
<data name="ArgumentOutOfRange_Generic_MustBeNotEqual" xml:space="preserve">
<value>{0} ('{1}') must not be equal to '{2}'.</value>
</data>
<data name="Arithmetic_NaN" xml:space="preserve">
<value>Function does not accept floating point Not-a-Number values.</value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using System.Runtime.CompilerServices;
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using System.Collections.Generic;

namespace System
{
Expand Down Expand Up @@ -90,46 +91,40 @@ public override string Message
public virtual object? ActualValue => _actualValue;

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

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

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

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

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

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

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

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

[DoesNotReturn]
private static void ThrowNotEqual<T>(string? paramName, T value, T other) =>
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>
Expand Down Expand Up @@ -161,6 +156,26 @@ public static void ThrowIfNegativeOrZero<T>(T value, [CallerArgumentExpression(n
ThrowNegativeOrZero(paramName, value);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is equal to <paramref name="other"/>.</summary>
/// <param name="value">The argument to validate as not equal to <paramref name="other"/>.</param>
/// <param name="other">The value to compare with <paramref name="value"/>.</param>
/// <param name="paramName">The name of the parameter with which <paramref name="value"/> corresponds.</param>
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(paramName, value, other);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is not equal to <paramref name="other"/>.</summary>
/// <param name="value">The argument to validate as equal to <paramref name="other"/>.</param>
/// <param name="other">The value to compare with <paramref name="value"/>.</param>
/// <param name="paramName">The name of the parameter with which <paramref name="value"/> corresponds.</param>
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(paramName, value, other);
}

/// <summary>Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is greater than <paramref name="other"/>.</summary>
/// <param name="value">The argument to validate as less or equal than <paramref name="other"/>.</param>
/// <param name="other">The value to compare with <paramref name="value"/>.</param>
Expand Down
5 changes: 2 additions & 3 deletions src/libraries/System.Private.Uri/src/System/UriScheme.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,12 @@ public static void Register(UriParser uriParser, string schemeName, int defaultP
ArgumentNullException.ThrowIfNull(uriParser);
ArgumentNullException.ThrowIfNull(schemeName);

if (schemeName.Length == 1)
throw new ArgumentOutOfRangeException(nameof(schemeName));
ArgumentOutOfRangeException.ThrowIfEqual(schemeName.Length, 1);

if (!Uri.CheckSchemeName(schemeName))
throw new ArgumentOutOfRangeException(nameof(schemeName));

if ((defaultPort > 0xFFFF || defaultPort < 0) && defaultPort != -1)
if ((uint)defaultPort > 0xFFFF && defaultPort != -1)
throw new ArgumentOutOfRangeException(nameof(defaultPort));

schemeName = schemeName.ToLowerInvariant();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,7 @@ public object this[int index]
if (list != null)
return list[index];

if (index != 0)
throw new ArgumentOutOfRangeException(nameof(index));
ArgumentOutOfRangeException.ThrowIfNotEqual(index, 0);

return _field;
}
Expand Down Expand Up @@ -97,8 +96,7 @@ public void RemoveAt(int index)
return;
}

if (index != 0)
throw new ArgumentOutOfRangeException(nameof(index));
ArgumentOutOfRangeException.ThrowIfNotEqual(index, 0);

_field = null;
}
Expand All @@ -107,8 +105,7 @@ public void Insert(int index, object value)
{
if (_field == null)
{
if (index != 0)
throw new ArgumentOutOfRangeException(nameof(index));
ArgumentOutOfRangeException.ThrowIfNotEqual(index, 0);
Add(value);
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,33 +227,26 @@ public XmlSchemaCollectionEnumerator GetEnumerator()
void ICollection.CopyTo(Array array, int index)
{
ArgumentNullException.ThrowIfNull(array);

ArgumentOutOfRangeException.ThrowIfNegative(index);

for (XmlSchemaCollectionEnumerator e = this.GetEnumerator(); e.MoveNext();)
{
if (index == array.Length)
{
throw new ArgumentOutOfRangeException(nameof(index));
}
ArgumentOutOfRangeException.ThrowIfEqual(index, array.Length);
array.SetValue(e.Current, index++);
}
}

public void CopyTo(XmlSchema[] array, int index)
{
ArgumentNullException.ThrowIfNull(array);

ArgumentOutOfRangeException.ThrowIfNegative(index);

for (XmlSchemaCollectionEnumerator e = this.GetEnumerator(); e.MoveNext();)
{
XmlSchema? schema = e.Current;
if (schema != null)
{
if (index == array.Length)
{
throw new ArgumentOutOfRangeException(nameof(index));
}

ArgumentOutOfRangeException.ThrowIfEqual(index, array.Length);
array[index++] = e.Current!;
}
}
Expand Down
Loading