Domanda

E 'possibile utilizzare insieme qualsiasi ?? operatore di strada e operatore && in caso successivo:

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

prossimi Ciò significa che:

  • se any è nullo allora this.Any.HasValue false ritorno
  • se any ha valore, allora restituisce il valore considerando un'altra proprietà booleana, vale a dire Any && SomeBool
È stato utile?

Soluzione

Mi chiedo come mai nessuno ha suggerito questo finora:

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

Questo restituisce

  • null se any è nullo, non importa quale sia il valore di this.SomeBool è;
  • true se entrambi any e this.SomeBool sono vere; e
  • false se any non è nullo, e this.SomeBool è falso.

Altri suggerimenti

Dal momento che si desidera tornare null nel caso in cui la sorgente è null, non credo ?? sta andando per aiutarti a scrivere questo qualsiasi più breve o più chiara.

E 'questo che vuoi dire?

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

Ho lasciato il valore restituito come bool? ma sembra che potrebbe essere cambiato solo bool.

Questo è stato testato in questo modo:

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;
        }
    }
}

che ritorna

False
False
True
False
False
False

Il comportamento qui non è la stessa come l'originale nullo debba essere rinviato per casi di prova 1 e 4 siano identici. Ma forse non è richiesto un comportamento?

Credo che quello che si sta cercando di fare è questo:

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

Tuttavia, credo che in casi come questo, è probabilmente più chiaro utilizzare un blocco if:

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

Se uno è null, poi si desidera tornare true o null, giusto?

L'operatore Null coalescenza non è andare a lavorare per come hai strutturato la logica per il metodo. Certo si potrebbe forzarlo in là, ma sta andando a guardare brutto e solo confondere chiunque lo legge.

Ho trovato il codice originale difficile da leggere e capire, quindi refactoring e rimosso l'operatore ternario per rivelare le intenzioni.

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

if (any == null)
    return null;

return any.Value && this.SomeBool;

Null coalescenza è solo bello stenografia e deve essere usata con giudizio

Person contact = Mother ?? Father ?? FirstSibling;

è più intenzione rivelare, e più facile da leggere + mantenere rispetto:

Person contact = Mother;
if (contact == null)
    contact = Father;
if (contact == null)
    contact = FirstSibling;

cosa è, non si vuole veramente utilizzare il ?? operatore. La sua pensati per rendere più facile evitare i valori nulli, in realtà si desidera mantenere i valori nulli.

Questo è il comportamento descritto:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top