Rozważ następujący kod:
#nullable enable
class Foo
{
public string? Name { get; set; }
public bool HasName => Name != null;
public void NameToUpperCase()
{
if (HasName)
{
Name = Name.ToUpper();
}
}
}
Na Name = Name.ToUpper () pojawia się ostrzeżenie, że Name to możliwe odwołanie zerowe, co jest wyraźnie niepoprawne. Mogę wyleczyć to ostrzeżenie, wpisując HasName, więc warunkiem jest if (Nazwa! = Null).
Czy jest jakiś sposób, w jaki mogę pouczyć kompilator, że prawdziwa odpowiedź HasName implikuje ograniczenie związane z brakiem wartości dopuszczalnej dla Name?
Jest to ważne, ponieważ HasName może faktycznie przetestować o wiele więcej rzeczy i może chciałbym użyć go w kilku miejscach lub może to być publiczna część powierzchni API. Istnieje wiele powodów, dla których warto uwzględnić sprawdzanie wartości NULL we własnej metodzie, ale wydaje się, że powoduje to uszkodzenie sprawdzania wartości referencyjnych.
c#
nullable-reference-types
John Melville
źródło
źródło
HasValue
na typ zerowalny, a nie sprawdzać gonull
. Prawdopodobnie nie wpływa to jednak na twój problem.#nullable disable
następnie#nullable enable
lubrestore
później ( docs.microsoft.com/en-us/dotnet/csharp/… ).!
operatora „cholera” .if(HasName) { Name = Name!.ToUpper(); }
Odpowiedzi:
Rozejrzałem się po różnych atrybutach
System.Diagnostics.CodeAnalysis
i nie mogłem znaleźć niczego odpowiedniego, co jest bardzo rozczarowujące. Najbliżej tego, co możesz osiągnąć, wydaje się być:Wiem, wygląda to dość nieporęcznie. Możesz zajrzeć do dokumentów MSDN pod kątem atrybutów zerowalnych , może znajdziesz coś fajniejszego.
źródło
if(Name != null) return Null.ToUpper()
, nie będzie ostrzeżenia o zerowym wyłuskaniu, nawet jeśli technicznie jest to warunek wyścigu w TOCTOU. Pamiętam, jak Mads Torgersen mówił o tym, jak to uważali, ale generowałoby tak wiele fałszywych trafień, że cała nullowa typy referencji byłaby bezużyteczna - 99% czasu twoje właściwości nie zostaną zmienione przez inny wątek. Wszystko, co musisz zrobić, to utworzyć atrybut, który sprawi, że sprawdzenie tej właściwości będzie traktowane jako sprawdzenie wartości null w innej właściwości.String jest typem odniesienia, a nullable (np.
int?
) To typy wartości nullable. Więc tak naprawdę nie możesz tego zrobićstring? myString
; Potrzebujesz tego:źródło