В следующем коде Unity / C# переменная collider выдает следующее предупреждение:
Warning CS0108 'Controller2D.collider' hides inherited member 'Component.collider'. Use the new keyword if hiding was intended.
Что это значит и как это исправить?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// require that our object has a box-collider-2d component
[RequireComponent(typeof(BoxCollider2D))]
// controller-2D script
public class Controller2D : MonoBehaviour {
// stores a reference to our object's box-collider-2d component
BoxCollider2D collider; // the warning occurs here
// ...
}
Обратите внимание, что повторяющийся вопрос касается предупреждения, выданного «Resharper», но по сути это одно и то же ...
Кстати, вероятный ответ на ваш вопрос «как мне это исправить?»: не пытайтесь скрыть участников. Возможно, вы сможете добиться успеха, не определяя собственное свойство collider, поскольку ваш Controller2D уже имеет свойство collider, унаследованное от его базового класса.





Это предупреждение означает, что базовый класс Controller2D с именем Component уже имеет свойство с тем же именем collider.
Предупреждение предназначено для того, чтобы сообщить вам, что любая реализация Controller2D будет использовать ваше определение и «скрывать» базовое определение. Чтобы предотвратить предупреждение, просто измените определение коллайдера на
новый коллайдер BoxCollider2D;
Тогда он узнает, что вы хотите скрыть эту примету, и предупреждение исчезнет.
Для этого нет особых причин. Публичные и внутренние свойства уже доступны. Если ваше свойство не соответствует или не расширяет свойство, которое вы скрываете, это, скорее всего, вызовет проблемы, поэтому, если вы не знаете, хотите ли вы скрыть другое свойство, вам следует переименовать его.
Не пытайтесь волей-неволей предлагать «исправление», просто сделав скрытие элементов явным, используя new. Есть причина, по которой компилятор предупреждает о сокрытии члена, если вы действительно явно не намерены скрывать член. Если вы предложите спрятать член наугад, могут возникнуть серьезные побочные эффекты. Скрытие участников следует использовать только в определенных ситуациях и только в том случае, если кто-то действительно знает, что подразумевает скрытие участников, чтобы можно было избежать возможных нежелательных побочных эффектов. (См. Повторяющийся вопрос в первом комментарии к этому вопросу здесь).
@ elgonzo Он спросил, почему это происходит и как это исправить. Что вы еще хотите? Вы хотите, чтобы я сказал ему не делать этого, если он не уверен, что хочет? Это правильный ответ. Я не обязан знать его намерения. Плюс я сказал ему назвать это как-нибудь по-другому. Боже
Он спросил, что это значит, а это значит, что он действительно не знает. Во всяком случае, все сказано ...
@egonzo Нет, никто не сказал ему, что это значит и почему это происходит. Я сказал ему
Нет, вы действительно не ... Вы просто сказали примерно в том же духе, что и «Вперед. Поместите туда ключевое слово new. Тогда будет использоваться ваше определение поля, а не определение базового класса». Нет. Будет ли он использоваться или нет, зависит не от помещения ключевого слова new, а от ссылочного типа переменных, ссылающихся на экземпляр Controller2D. Но, учитывая ваше отношение к этому, я думаю, вам действительно все равно, что на самом деле делает прячущийся член ...
@egonzo, вы только что опубликовали возможный дубликат вопроса, который не имеет отношения к делу. И ты прав. Его не волнует новое определение, и он будет использовать его независимо, но он отключает компилятор от выдачи предупреждений. Он спросил почему, я сказал ему почему. Чего я не сделал, так это отправил случайный ответ, не связанный с вопросом. Хорошего дня, сэр
На самом деле, если OP явно не разъясняет в письмах, что он не знает, что скрывается или делает член, даже если это очевидно из вопроса, ваша точка зрения заключается в том, что OP должен знать то, о чем он не знает. . Ладно, нет смысла развивать этот аргумент ...
Да, оператор должен знать, намерен ли он спрятать участника после того, как я сказал ему, что это означает. Он не знал, что это значит. Я сказал ему в первом предложении. Я сказал ему, как это исправить. Это лучше, чем размещать совершенно не связанный с ним возможный дубликат, объясняя вещи, которые явно выше его головы. Вы еще не ныли?
Итак, теперь вы говорите, что «если ОП намеревается сделать то, о чем он ничего не знает, он должен сделать это и так». И вообще все это "над головой ОП". "Кого волнует, что будет с кодом OP, OP все равно ничего не поймет, для него это слишком много." Амирит? Пожалуйста, продолжайте, становится все интереснее ...
Нет. Я никогда не говорил ничего подобного. Он спросил, что это значит, и я ответил ему. Он спросил, как это исправить, и я сказал ему ответ. Буквально вы можете сделать только две вещи. Чего я не сделал, так это не опубликовал дубликат, который не отвечает на вопрос, объясняющий, когда и если вам следует скрывать свойства, когда вы сами сказали, он даже не знает, что означает скрытие свойства. Теперь я могу добавить больше описания, если хотите, но все, что вам нужно было сделать, это спросить. Или не стесняйтесь редактировать ответ, если хотите.
@JSON Есть два ответов на проблему (возможно, три), один из них более правильный, чем другой. Вы рассказали ему об одном из них, а тот, о котором вы ему рассказали, является очень конкретным вариантом использования-только-делай-если-знаешь-что-делаешь. Остальные (два) гораздо более простые и общие. Кроме того, цель дублирования верна, помните, не имеет значения, отличается ли вопрос, но имеет ли значение ответ применим.. И в этом случае это так.
@ Draco18s Я четко сказал ему два: либо используйте ключевое слово 'new', либо переименуйте его. Почему вам так трудно это видеть? Это прямо здесь. лол, о человек. Кстати, какой третий я не вижу?
В вашем ответе есть переименование, но в качестве небольшого комментария в самом конце. В любом случае третий вариант - удалить поле и использовать объявление из базового класса.
Вы, люди, слишком разборчивы для моих ссылок. И да, я тоже об этом упоминаю ...
Это поздний ответ, но он может оказаться полезным. Прежде чем углубиться в вашу проблему, сделаем введение:
p.s.1 Под «странными проблемами полиморфизма» я подразумеваю, что в зависимости от указателя на объект будет использоваться член родительского класса или член дочернего класса. Подробнее читайте здесь: https://stackoverflow.com/a/22809757/1854557 p.s.2 В моем тестовом коде, когда я добавляю и удаляю новую клавиатуру, результат тот же. Таким образом, кажется, что не добавление нового ключевого слова просто генерирует предупреждение, но не меняет поведение наследования / полиморфизма.
Вы знаете, как это работает, когда вместо этого применяется к двум интерфейсам? Я получаю то же предупреждение, но, на мой взгляд, я должен получить значение свойства того интерфейса, в который я передаю объект.
Возможный дубликат Почему resharper предпочитает не скрывать свойство абстрактного класса внутри другого абстрактного класса?