Używam autobreta do klasy A i B. Projekt jest projektem Rdzeń .NET z <Nullable>enabled</Nullable>.

public class A 
{
    public ClassX? X { get; set; } // ClassX is a custom class with the property of Value.
    //.... 
}

public class B 
{
    public string? X { get; set; } 
   // ....
}

W następnym kodzie mapowania

public void Mapping(Profile profile)
{
    // ....

    _ = profile?.CreateMap<A, B>()
        .ForMember(d => d.X, o => o.MapFrom(s => s.X.Value)); // warning on s.X
}

Ma następujące ostrzeżenie na s.X:

OSTRZEŻENIE CS8602 DEREFERENCJA Ewentualnie NULL odniesienia.

Jak pozbyć się ostrzeżenia bez użycia #pragma warning disable CS8602?

Próbowałem zmienić o.MapFrom(s => s.X.Value) do o.MapFrom(s => s.X?.Value) za pomocą Null-Conditional. Ale ma następujący błąd na s.X?.Value.

Błąd CS8072 Drzewo wyrażające Lambda nie może zawierać operatora rozmnożeniowego NULL

2
ca9163d9 26 grudzień 2019, 19:22

1 odpowiedź

Najlepsza odpowiedź

Ponieważ MapFrom akceptuje Expression<>, a nie Func<>, nie można używać operatora warunkowego Null. Nie jest to ograniczenie autobreta, jest to ograniczenie drzew ekspresji w przestrzeni nazw System.Linq.Expressions i kompilatora C #.

Jednak możesz użyć operatora Therary:

_ = profile?.CreateMap<A, B>()
    .ForMember(d => d.X, o => o.MapFrom(s => s.X == null ? null : s.X.Value));

Zgodnie z deklaracją, właściwość X jest nieważna. Dlatego musisz zapewnić, że nie będzie dewelowany, jeśli jest null.

(Według @attersson) Jeśli chcesz przypisać inną wartość w obudowie zerowej, można użyć operatora Null-Coalescing w połączeniu z operatorem Therary:

(s.X == null ? null : s.X.Value) ?? someDefaultValue
4
Olivier Jacot-Descombes 26 grudzień 2019, 16:59