Метод расширения в массиве не может быть сопоставлен при использовании аргументов `ref`

Ниже приведен код, с которым я работаю; он добавляет методы к встроенным типам, чтобы найти индекс элемента в массиве, если он находится в массиве. У меня проблема в том, что код для метода char[].IndexOf работает, но мой новый код для строки [,] - нет.

string [,]. IndexOf (строка из переменной, int x,int y);

Отображает ошибку: лучшее совпадение перегруженного метода для 'System.Array.IndexOf(int[], int, int)' имеет недопустимые аргументы. Аргумент 1: невозможно преобразовать строку 'string' в 'int[]'

Я не понимаю, в чем проблема. Я определил метод для получения строки, а не целочисленного массива, и тип не имеет встроенной функции IndexOf.

Выдержка из кода: (Не точный код, надеюсь, только то, что имеет значение)

Using Extensions;

namespace one
{
    class Form
    private static char[] Alp = {'s','f'};

    private method1
    {
         int pos = Alp.IndexOf(char[x]);
    }

    private method2
    {
          string[,] theory = table of letters

          theory.IndexOf(string_array[0], x, y);
    }

namespace Extensions
{
    public static class MyExtensions
    {
        //Add method IndexOf to builtin type char[] taking parameter char thing
        public static int IndexOf(this char[] array, char thing)
        {
            for (int x = 0; x < array.Length; x++)
            {
                char element = array[x];
                if (thing == element) { return x; }
            }
            return -1;
        }

        public static void IndexOf(this string[,] array, string find, ref int x, ref int y)
        {

        }
    }
}

3 ответа

Решение

Ты не забыл ref в вашем методе вызова?

theory.IndexOf(string_array[0], ref x, ref y);

Если x и y установлены вашим методом IndexOf, вы должны использовать вместо ref.

public static void IndexOf(this string[,] arr, string find, out int x, out int y)
{

}

// Then, you need to specify 'out' at the call site
theory.IndexOf(string_array[0], out x, out y);

Вы можете использовать Tuple, чтобы избежать отсутствия параметров:

public static Tuple<int, int> IndexOf(this string[,] array, string find)
{
    // Logic here
    return new Tuple(x, y);
}
public static void IndexOf(this string[,] array, string find, ref int x, ref int y)

Оказывается, потому что x и y запрашиваются по ссылке, они также должны вызываться с ключевым словом ref. Почему ошибка сказала, что первый параметр был неправильным, получил меня.

Спасибо всем, кто отправил ответы.

Другие вопросы по тегам