3

Можно ли использовать вместе каким-либо образом оператор ?? и оператор && в следующем случае:Null-коалесцирующий оператор и оператор && в C#

bool? Any 
{ 
    get 
    { 
     var any = this.ViewState["any"] as bool?; 
     return any.HasValue ? any.Value && this.SomeBool : any; 
    } 
} 

Это означает, что в следующем:

  • если any равна нулю затем this.Any.HasValue return false
  • если any имеет значение, то оно возвращает значение с учетом другого булевого свойства, то есть Any && SomeBool
+0

Почему бы вам хотите использовать? оператор? Сделать его короче? –

+0

@ Хенк Холтерман: Да. И для практики использования операторов. – abatishchev

ответ

4

мне интересно, почему никто не предложил это до сих пор:

bool? any = this.ViewState["any"] as bool?; 
return any & this.SomeBool; 

Это возвращает

  • null если any не равна нулю, независимо от того, что значение this.SomeBool является;
  • true если оба: any и this.SomeBool - это правда; и
  • false если any не является нулевым, а this.SomeBool является ложным.
+0

код выглядит хорошо, описание неверно, хотя (как вы можете одновременно вернуть как «null», так и «false», но это то, что скажут ваши правила для «any = = null' и 'this.SomeBool == false'. –

+0

@Henk Holterman: Почему операнды« bool »и« bool? », а не' 'bool? 'и' bool''! Левый операнд явно типа 'bool?', как я объявил это как таковой. – dtb

+1

@ Хенк Холтерман: Да, но я сделал опечатку при копировании ее на свой ответ :-(Исправлено это сейчас. Моя тестовая программа: 'bool? x = null; bool y = true; bool? z = x & y; ' – dtb

3

Это вы имеете в виду?

bool? Any 
{ 
    get 
    { 
     return ((this.ViewState["any"] as bool?) ?? false) && this.SomeBool; 
    } 
} 

Я оставил возвращаемое значение как bool? но похоже, что он может быть изменен только на bool.

Это было проверено, как это:

class Program 
{ 
    private static readonly Dictionary<string, object> ViewState = new Dictionary<string, object>(); 
    private static bool SomeBool; 

    static void Main(string[] args) 
    { 
     ViewState["any"] = (bool?)null; SomeBool = true; Console.WriteLine(Any); 
     ViewState["any"] = (bool?)false; SomeBool = true; Console.WriteLine(Any); 
     ViewState["any"] = (bool?)true; SomeBool = true; Console.WriteLine(Any); 
     ViewState["any"] = (bool?)null; SomeBool = false; Console.WriteLine(Any); 
     ViewState["any"] = (bool?)false; SomeBool = false; Console.WriteLine(Any); 
     ViewState["any"] = (bool?)true; SomeBool = false; Console.WriteLine(Any); 
     Console.ReadLine(); 
    } 

    static bool? Any 
    { 
     get 
     { 
      return ((ViewState["any"] as bool?) ?? false) && SomeBool; 
     } 
    } 
} 

который возвращает

False 
False 
True 
False 
False 
False 

поведение здесь не совсем то же самое, что и оригинал, как нуль должен быть возвращен для тестов 1 и 4, чтобы быть идентичны. Но, может быть, это поведение не требуется?

+0

К сожалению, нет. 'result as bool?' всегда имеет значение 'HasValue = true'. не так ли? – abatishchev

+0

Вы правы Хенк, поведение другое –

+1

Он хочет вернуть null, если таковой имеет значение null И два других условия являются ложными. Итак, он хочет TRUE, FALSE и NULL – Armstrongest

-1

Это поведение, которое вы описали:

return (any ?? false) && this.SomeBool

+0

Как ответ Дэниела Реншоу, ваш всегда имеет значение - 'true' или' false', никогда 'null' – abatishchev

4

Так как вы хотите, чтобы вернуться null в случае источник null, я не думаю, что ?? собирается помочь вам писать это любой короче или понятнее ,

+0

Кажется, что вы правы. Оператор '??' предназначен для возврата значения в любом случае. Это именно то, что мне не нужно. – abatishchev

3

Я думаю, что вы пытаетесь сделать, это:

return any ?? (any.Value && this.SomeBool) ? true : new Nullable<bool>(); 

Однако, я думаю, что в таких случаях, как это, вероятно, более ясно использовать, если блок:

if (!any.HasValue) 
    return (any.Value && this.SomeBool) ? true : any; 
else 
    return any; 

Если любой - null, то вы хотите вернуть true или null, правильно?

1

вещь, вы действительно не хотите использовать ?? оператор. Это означает, что вам легко избежать нулей, вы действительно хотите сохранить null.

3

Оператор Null Coalescing не будет работать для того, как вы структурировали логику для своего метода. Конечно, вы могли бы заставить его там, но это будет выглядеть уродливо и просто смутить тех, кто его читает.

Я нашел оригинальный код, который трудно читать и понимать, поэтому реорганизовал и удалил тройного оператора, чтобы выявить намерения.

bool? any = this.ViewState["any"] as bool?; 

if (any == null) 
    return null; 

return any.Value && this.SomeBool; 

Null коалесцирующий просто приятно стенографии и должны использоваться рассудительно

Person contact = Mother ?? Father ?? FirstSibling; 

Есть более Намерение показательны, и легче читать + поддерживать, чем:

Person contact = Mother; 
if (contact == null) 
    contact = Father; 
if (contact == null) 
    contact = FirstSibling; 
Смежные вопросы