Есть ли способ заставить ссылку на другой тип ссылки в c#? - PullRequest
0 голосов
/ 26 января 2020

Вот мой код:

public ref TComponent Get<TComponent>()
    where TComponent : struct, IComponent
{
    for (int i = 0; i < Components.Length; i++)
    {
        if (Components[i] is TComponent)
        {
            // CS8151: The return expression must be of type 'T' because this method returns by reference
            return ref Components[i];
        }
    }

    // throw an exception
}

Итак, как вы можете видеть, я пытаюсь вернуть ссылку на конкретный c объект, содержащийся в IComponent[], и я знаю, что все эти объекты являются типами значений.

Код скомпилировался бы, если бы мой метод возвратил ref IComponent вместо этого, но проблема была бы такой же, как если бы я был вынужден выполнить преобразование на выходе метода.

Я знаю, что объект, который я хочу вернуть, имеет правильный тип и может быть интерпретирован как TComponent, но компилятор не может этого знать и отправляет мне ошибку. Во-первых, я хотел использовать указатели, но они могут использоваться на управляемых типах.

Итак, вот мой вопрос: как я могу сказать компилятору, что мой объект имеет правильный тип и может быть возвращен по ссылке?

Другими словами, как я могу преобразовать ссылочный тип в другой?

1 Ответ

0 голосов
/ 26 января 2020

Обобщения не предназначены для возврата любого типа. Обобщения являются типобезопасными. Поэтому, какой бы тип вы ни передавали с помощью метода Get (), вам нужно возвращать именно этот тип.

Bat, вы можете заставить все типы наследовать один и тот же интерфейс или один и тот же базовый тип, а затем вернуть этот тип.

Также необходимо учитывать комментарий @RamblinRose

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...