Почему приведение к объекту сначала необходимо для удовлетворения компилятора, но компилятор также говорит, что приведенC#

Место общения программистов C#
Anonymous
Почему приведение к объекту сначала необходимо для удовлетворения компилятора, но компилятор также говорит, что приведен

Сообщение Anonymous »

Вот MRE, который пытается свести мою первоначальную проблему к чему-то как можно меньшему:

Код: Выделить всё

using System.Diagnostics;

List xs = new() { "a", "b" };
// normally xs would be the result of a method call that returns List,
// but for some reason, we know it's List
// so we first do a sanity check
if (xs.Exists(x => x is null))
{
throw new UnreachableException("Something is broken, we expected no nulls");
}
// and we want to cast it. That doesn't work:
List ys = xs;
// that doesn't work either:
List zs = (List)(object)xs;
Под «Это не работает» я имею в виду, что получаю:

Обнуляемость ссылочных типов в значении типа «System.Collections.Generic.List» не соответствует целевому типу «System.Collections.Generic.List»

Доказательство:
Изображение

Под "это тоже не работает" я имею в виду, что больше не получаю указанную выше ошибку, но получаю:

Приведение типов является избыточным

Доказательство:
Изображение

Обратите внимание:

Код: Выделить всё

List ys = (List)xs
приводит к тому же результату, что и

Код: Выделить всё

List ys = xs;
Как лучше всего поступить в этой ситуации? Очевидно, я мог бы создать новую переменную List и заполнить ее циклом for, но это означало бы, что мне пришлось бы дорого заплатить с точки зрения объема памяти и времени выполнения. То, что у меня есть сейчас, мне ничего не стоит, за исключением надоедливых предупреждений, с которыми может быть трудно и неприятно справиться коллегам/мне в будущем.
Ни одно из этих решений не кажется удовлетворительным.
(Я использую .NET = 10.0.104 и пишу код на RIDER = JetBrains Rider 2026.1.0.1. Я использую .NET & RIDER на компьютере с Windows 11.)

Вернуться в «C#»