Ответ 1
Проведя некоторые исследования, я смог найти только предыдущие билеты SO и несколько блогов, и в конечном итоге все они использовали тот же обходной путь, что и вы. Затем я нашел сообщение об ошибке, которое кто-то подал в Microsoft Connect в 2011 году (теперь доступно только на Wayback Machine или в более удобочитаемом формате на моем блоге), на которое в итоге был дан ответ примерно через год Чак Инглэнд, сотрудник MSFT.
TL; DR. Это было сознательное решение, принятое командой благодаря функции мульти-таргетинга, добавленной в VS2008 (возможность изменить цель проекта .NET Framework).
Поскольку целевая структура требует "System.Core", и удаление ее предотвратит сборку (насколько я понимаю, ответ чака), они решили навязать ссылку на нее, даже если вы на самом деле не видите ее в списке ссылки.
Вы можете сказать, что это "безопасный" взлом с нежелательным побочным эффектом, который выдает эту ошибку, когда вы снова пытаетесь добавить его в ссылки, и вам в конечном итоге нужно редактировать файл проекта напрямую.
Microsoft Connect был удален в 2018 году, но здесь соответствующие части оригинальной темы:
Да, опыт не велик. Поскольку требуется System.Core, вы никогда не должны его удалять. Мы исправили это, добавив его для вас, даже если вы удалите ссылку. [A] s сообщение, которое вы видели, указывает на System.Core неявно ссылается. Таким образом, тот факт, что вы удалили его, кроме физического удаления строки из файла проекта, никак не изменил сборку.
Существуют законные сценарии, когда вы можете захотеть сделать это, но это очень острый случай. Тем не менее, мы должны слепо игнорировать тот факт, что при добавлении его обратно генерируется ошибка. Многое из этого было навязано нам предыдущими версиями, которые не понимали многоцелевой таргетинг и просто не были очищены.
[Y] вы можете вручную добавить его обратно, щелкнув правой кнопкой мыши на узле проекта и выбрав Unload. Снова щелкните правой кнопкой мыши узел проекта и выберите "Изменить". В редакторе скопируйте другую ссылочную строку (например, для "Система") и вставьте ее ниже исходной ссылки в той же ItemGroup. Измените имя ссылки на "System.Core". Щелкните правой кнопкой мыши узел проекта и выберите "Перезагрузить". Выберите "да" для вопроса, чтобы сохранить и перезагрузить.
VS2008 неправильно обрабатывал мульти-таргетинг. Это позволило бы вам создавать вещи, которые не были законными. В VS2010 мы очень старались убедиться, что, если он собирается для целевой платформы, он будет работать на целевой среде. Не могу сказать, что знаю места, где это не так.
Мы не можем вернуться к пути VS2008, так как он не понимает многоцелевой таргетинг. Он также не понимал настоящих "профилей", таких как клиентский профиль .NET 4.0 framework. На самом деле проблема, с которой вы сталкиваетесь, заключается в том, что система VS2008 была модернизирована для работы с многоцелевым таргетингом, а новый набор правил отклоняет ссылку.
В этом случае мы создаем, даже если вы удалили ссылку. Вы могли бы сказать, но это не должно было быть построено. Но он будет работать на целевой структуре и, следовательно, должен был быть построен. Тот факт, что мы добавили для вас "обязательную" ссылку, является отчасти неудачным опытом ее разработки.
Мы на самом деле просто не поняли это достаточно рано, и с действительно твердым пониманием того, как мы могли бы это исправить, чтобы получить исправление до нашего релиза. Но тот факт, что вы всегда должны ссылаться и, следовательно, никогда не удалять "System.Core", сделал это не исправлением, поскольку 99% клиентов никогда не будут делать это.