Комментарии 11
В ошибке на 9-ом месте, учитывает ли анализатор, что ioPendingRequests может быть свойством расширения для nullable типа, которое всегда возвращает не null?
Я не слышал о том, что в C# появились extensions свойства. Можете, пожалуйста, более конкретно описать сценарий, о котором вы говорите?
В любом случае, предупреждение анализатора связано не с тем, что ioPendingRequests — null. Речь идёт о том, что ctx.prevCtx может быть null, а это значит, что и всё выражение ctx.prev Ctx?.ioPendingRequests может быть null (т. к. используется оператор '?.'), вне зависимости от того, что возвращает ioPendingRequests.
Да, извиняюсь, перепутал с Partial Properties из C# 13. Это совсем не то.
Но если бы было не ioPendingRequests, а getIoPendingRequests()
- то это вполне могло быть методом расширения в nullable ref types коде, например так:public static List<int> getIoPendingRequests(this ctxType? ctx) => []
то выражение Ctx?.getIoPendingRequests()
уже не может быть null.
Ctx?.getIoPendingRequests()
Это в любом случае будет null. ? оператор не дает вызвать метод, если ссылка null, без разницы, это extension метод или метод класса.
Если я правильно понял описанный вами кейс, то null всё ещё может быть.
Можете сами проверить:
MyClass? myClass = null;
var list = myClass?.GetList();
Console.WriteLine(list == null); //true
public class MyClass
{
public static MyClass Instance => new MyClass();
}
public static class MyExtensions
{
public static List<MyClass> GetList(this MyClass myClass) => [];
}
Спасибо за ответы! Я тоже перепроверил. Вы полностью правы.
Да, можно сделать extension на string?
или int?
, но при вызове не будет ?.
В случае с объектным типом даже IDE выдаёт предупреждение, а в случае с value-type вообще ошибка компиляции.
Вот так и появляются такие ошибки в коде, когда базовые правила языка забываются ))
Пункт со слабой ссылкой интересный. Получается, что API подталкивает к написанию некорректного кода?
В каком-то смысле да. Хотя в документации есть уточнение о подобном поведении.
А судьи кто? Я в смысле, это мнение одного автора или был опрос унутренний, или это топ по частоте всплывания в репортах или еще чего?
(wr.Target as TextGenerator).Invalidate();
Вообще, здесь тоже есть вопросы. Если wr.Target - не TextGenerator, то упадет. Видимо, внешняя логика подразумевает, что в этом месте "мамой клянусь" всегда будет TextGenerator, но такой подход запросто со временем приведет к ошибкам.
Топ-10 ошибок, найденных в C# проектах за 2024 год