Domanda

È possibile sovraccaricare l'operatore a coalescenza nulla per una classe in C #?

Dire ad esempio che voglio restituire un valore predefinito se un'istanza è nulla e restituire l'istanza in caso contrario. Il codice sarebbe simile a questo:

   return instance ?? new MyClass("Default");  

Ma cosa succede se vorrei utilizzare l'operatore null coalescing per verificare anche se MyClass.MyValue è impostato?

È stato utile?

Soluzione

Buona domanda! Non è elencato in un modo o nell'altro nell ' elenco di operatori sovraccaricabili e non sovraccaricabili e nulla è menzionato nella la pagina dell'operatore .

Quindi ho provato quanto segue:

public class TestClass
{
    public static TestClass operator ??(TestClass  test1, TestClass test2)
    {
        return test1;
    }
}

e viene visualizzato l'errore "Operatore binario sovraccaricabile previsto". Quindi direi che la risposta è, a partire da .NET 3.5, un no.

Altri suggerimenti

Secondo lo ECMA-334 , esso non è possibile sovraccaricare il ?? operatore.

Allo stesso modo, non è possibile sovraccaricare i seguenti operatori:

  • =
  • & amp; & amp;
  • ||
  • :?
  • ?.
  • controllare
  • incontrollato
  • nuovo
  • typeof
  • come
  • è

Risposta semplice: No

I principi di progettazione C # non consentono il sovraccarico dell'operatore che modifica la semantica della lingua. Pertanto operatori complessi come incarico composto, operatore ternario e ... non possono essere sovraccaricati.

Si dice che faccia parte della prossima versione di C #. Da http://damieng.com/blog/ 2013/12 / 09 / probabili-c-6-0-funzioni-illustrato

7. Controllo null monadico

Rimuove la necessità di verificare la presenza di null prima di accedere a proprietà o metodi. Conosciuto come Safe Navigation Operator in Groovy).

Prima

if (points != null) {
    var next = points.FirstOrDefault();
    if (next != null && next.X != null) return next.X;
}   
return -1;

Dopo

var bestValue = points?.FirstOrDefault()?.X ?? -1;

Se qualcuno è qui alla ricerca di una soluzione, l'esempio più vicino sarebbe quello di farlo

return instance.MyValue != null ? instance : new MyClass("Default");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top