Прочитавши це запитання в HNQ, я продовжив читати про Nullable Reference Types в C # 8 і зробив кілька експериментів.
Я дуже усвідомлюю, що 9 разів з 10, а то й частіше, коли хтось каже "Я знайшов помилку компілятора!" це насправді задумом і власним непорозумінням. І оскільки я почав вивчати цю особливість лише сьогодні, я ясно, що я не дуже добре її розумію. Якщо це не вдається, давайте подивимось на цей код:
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
Прочитавши документацію, до якої я посилався вище, я би сподівався, що s == null
рядок надішле мене попередженням - адже s
явно нерегульований, тому порівнювати його null
не має сенсу.
Натомість я отримую попередження в наступному рядку, і попередження говорить про те, що s
можлива нульова посилання, хоча для людини очевидно, що це не так.
Більше того, попередження не відображається, якщо ми не порівнюємо s
їх null
.
Я зробив деякий Googling, і я потрапив на проблему GitHub , яка виявилася зовсім іншою, але в процесі роботи я провів розмову з дописувачем, який дав трохи більше розуміння такої поведінки (наприклад, "Нульові перевірки часто є корисним способом сказати компілятору відновити його попереднє висновок про мінливість змінної. " ). Однак це все ще не залишило мене на головне питання без відповіді.
Замість того, щоб створити нове видання GitHub і, можливо, зайняти час надзвичайно напружених учасників проекту, я передаю це спільноті.
Не могли б ви пояснити мені, що відбувається і чому? Зокрема, чому на цьому s == null
рядку не створюються попередження , і чому ми маємо, CS8602
коли це не здається, що null
тут можлива посилання? Якщо висновок про нульовість не є кульовим, як підказує пов'язана нитка GitHub, як це може піти не так? Які б це були приклади?
?
оскільки s
це не зводиться до нуля. Це не стає нульовим, просто тому, що ми були досить нерозумні, щоб порівняти його null
.