JetBrains Rider предлагает сделать параметр типа Component. Почему?

В настоящее время я использую JetBrains Rider в качестве IDE.

private void RemoveAlert(int idx, Image lockImg)
{
    ...
}

При написании приведенного выше кода я получил предложение от Райдера преобразовать параметр типа Image метода RemoveAlert в Component. Я не знаю, почему.

Интересно, является ли это предложение более действенным или привычным? Если что-нибудь знаете, ответьте, пожалуйста.

Снимок экрана для предложения от Райдера:


person kugorang    schedule 27.06.2018    source источник
comment
Если вы пишете метод, который принимает Dog, но никогда не вызываете Bark, вы также могли бы заставить его принимать Animal, и тогда он станет более полезным методом, потому что существует больше возможных способов его вызова.   -  person Eric Lippert    schedule 28.06.2018
comment
Вы используете Rider, тогда он не имеет ничего общего с ReSharper (который является надстройкой VS). У них один и тот же языковой движок и множество других функций, но это разные продукты.   -  person Lex Li    schedule 28.06.2018
comment
Кстати, Re # и Rider также используют плагин resharper-unity github.com/JetBrains/resharper-unity В Rider он входит в комплект, в Re # может быть установлен явно.   -  person Ivan Shakhov    schedule 28.06.2018
comment
@LexLi: В документации и маркетинге Rider прямо указано, что он использует инспекции Resharper. Кроме того, синтаксис для включения / отключения инспекций в rider по-прежнему // ReSharper disable [inspection id]. Вопрос может касаться конкретного гонщика или конкретного Resharper, но этот вопрос относится к обоим. В то время как педант может сказать, что вы технически правы, говоря, что это не вопрос Resharper, OP может с радостью принять ответы от экспертов Resharper, а пользователи Resharper могут с удовольствием проконсультироваться с этим вопросом для получения ответов.   -  person Brian    schedule 28.06.2018


Ответы (1)


Я не могу точно понять, как вы используете переменную (текст при наведении охватывает некоторые вещи), но ReSharper предложит это, когда вы используете производный класс, но не какую-либо из его дополнительных функций. Похоже, вы получаете ссылку на его свойство gameObject, и если вы посмотрите на иерархию наследования, Component - это класс нижнего уровня, который имеет это свойство:

UnityEngine.UI.Image
UnityEngine.UI.MaskableGraphic
UnityEngine.UI.Graphic
UnityEngine.EventSystems.UIBehaviour 
UnityEngine.MonoBehaviour
UnityEngine.Behaviour
UnityEngine.Component <- has gameObject property
UnityEngine.Object    <- doesn't have gameObject property

Кроме того, если вас это раздражает, вы можете добавить к функции следующее:

// ReSharper disable once SuggestBaseTypeForParameter

Или вы можете поместить это в начало самого файла, чтобы охватить все его функции:

// ReSharper disable SuggestBaseTypeForParameter
person Foggzie    schedule 27.06.2018