È possibile sovraccaricare l'operatore a coalescenza nulla?
-
20-08-2019 - |
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?
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");