Wpis z mikrobloga

Jaka jest różnica między tym:

_freeIndex == null ? _freeIndex = new FreeIndex(index, null) : _freeIndex = new FreeIndex(index, _freeIndex);
a tym:

if (_freeIndex == null)
{
_freeIndex = new FreeIndex(index, null);
}
else
{
_freeIndex = new FreeIndex(index, _freeIndex);
}

Myślałem że pierwszy sposób to zwyczajne skrócenie ifa, ale VS pokazuje błąd CS0201 i sugeruje zmianę typu zwracanego przez metodę z void na FreeIndex (nie chcę nic zwracać, w ifie ma się tylko zmienić wartość pola), albo użycie:

_ = _freeIndex == null ? _freeIndex = new FreeIndex(index, null) : _freeIndex = new FreeIndex(index, _freeIndex);
#csharp #naukaprogramowania
  • 5
@Goglez: nie znam się, ale się wypowiem: czy to by nie zadziałało?

_freeIndex = (_freeIndex == null) ? new FreeIndex(index, null) : new FreeIndex(index, _freeIndex);
wydaje mi się, że skróconego zapisu używa się w operacjach przypisania, ale nic za to nie dam sobie uciąć.
@Goglez: Przede wszystkim - operator warunkowy zwraca wartość na podstawie warunku (jedną albo drugą), a if...else wartości nie zwraca, a jedynie na podstawie warunku decyduje czy wykonać dany blok czy nie - przy czym blok może zawierać w sobie cokolwiek (wywołania, przypisania, inne bloki warunkowe, pętle itd), natomiast dla operatora warunkowego ZAWSZE musi on przyjąć postać:

warunek ? wartosc_dla_true : wartosc_dla_false
W twoim przykładzie ifa faktycznie można skrócić do takiej postaci:
nie zawsze jest możliwe proste przekształcenie z postaci ifa do operatora warunkowego - te konstrukcje nie są sobie równoważne i mają różne zastosowania.


@t3m4: @Szab: Stąd problem, myślałem że to działa tak samo. Dzięki.