# V3184. The argument's value is greater than the size of the collection. Passing the value into the 'Foo' method will result in an exception.

The analyzer has detected that the index passed to the method is greater than or equal to the number of elements of the collection. This can cause an exception.

Let's look at the following example to delve deeper into this issue:

    public static void Foo()
    {
      List<string> list = new List<string>(20) { "0", "1", "2" };
      list.RemoveAt(list.Count);
    }

If we try to remove an element, an exception is thrown. The 'RemoveAt' method throws an exception when the first argument is greater than or equal to the number of elements in the collection.

Here's the fixed version of the code:

    public static void Foo()
    {
      List<string> list = new List<string>(20) { "0", "1", "2" };
      list.RemoveAt(list.Count - 1);
    }

Let's look at a more complex example of an error:

    public static void ProcessList()
    {
      List<string> list = new List<string>(20) { "0", "1", "2" };
      string str = GetStringOrNull(list, list.Count); // <=
    }

    public static string GetStringOrNull(List<string> list, int index)
    {
      if (index > list.Count)
        return null;

      return list.ElementAt(index);
    }

The 'list' collection is passed to the 'GetStringOrNull' method, which contains an error in the condition of the 'if' statement. The method should return 'null' when such arguments are passed to it, but an exception is thrown due to the error.

The fixed code:

    public static void ProcessList()
    {
      List<string> list = new List<string>(20) { "0", "1", "2" };
      string str = GetStringOrNull(list, list.Count);
    }

    public static string GetStringOrNull(List<string> list, int index)
    {
      if (index >= list.Count)
        return null;

      return list.ElementAt(index);
    }

This diagnostic is classified as:

CWE-687