2015-10-31 13 views
15

sappiamo:come ignorare `operatore is`

int? number = 10; 
Console.WriteLine(number is int); // true 

ma:

NotNull<string> text = "10"; // NotNull<> is my struct 
Console.WriteLine(text is string); // false 

voglio text is string ritorno vero, come posso farlo?

-------------------------------- modificare

qui è la mia NotNull:

public class NotNull<T> where T : class 
{ 
    public T Value { get; } 

    private NotNull(T value) 
    { 
     this.Value = value; 
    } 

    public static implicit operator T(NotNull<T> source) 
    { 
     return source.Value; 
    } 

    public static implicit explicit NotNull<T>(T value) 
    { 
     if (value == null) throw new ArgumentNullException(nameof(value)); 
     return new NotNull<T>(value); 
    } 
} 

se una classe stava dichiarando come:

public class A 
{ 
    public NotNull<string> B { get; set; } 
} 

spero solo che qualsiasi serializzatore può serializzare e deserializzare esso stesso come:

public class A 
{ 
    public string B { get; set; } 
} 

-------------------------------- Edit 2

ho trovato questa è una domanda impossibile:

  1. se NotNull<> è di classe, default(NotNull<>) è nullo, non faccio nulla.
  2. se NotNull<> è struct, default(NotNull<>).Value è nullo.

scusa per la domanda.

+2

'is' non è un gestore che esegue l'override. – PetSerAl

+0

@PetSerAl rendi questo in una risposta (non ce n'è altri) in modo che la domanda possa essere chiusa – Carsten

+1

Anche se hai fatto in modo che questi operatori funzionino, sei consapevole che se "NotNull " è un tipo di valore, che non puoi impedire "default" (NotNull ) 'dall'uso? Ricordo di aver letto che questa è la ragione principale per cui C# non ha qualcosa di simile a 'NotNull' integrato: non funziona e non può funzionare se non si restringono così severamente gli usi validi di esso che il linguaggio diventa praticamente inutilizzabile. – hvd

risposta

7

Come già sottolineato, iscannot be overloaded. Se pubblichi più contesto sulla tua stringa non nullable forse possiamo trovare qualche altra soluzione.

L'operatore is funziona sui tipi annullabili e sui relativi tipi sottostanti non perché è sovraccarico, ma poiché questo comportamento è definito esplicitamente nelle specifiche della lingua. I tipi Nullable vengono considerati come casi speciali quando viene valutato is.

È possibile trovare una descrizione dettagliata dell'operatore is nella sezione 7.10.10 delle specifiche del linguaggio C#. Questi sono i componenti pertinenti ai tipi nullable:

Il risultato dell'operazione E is T, dove E è un'espressione e T è un tipo (...) È valutata come segue

• (...)

• In caso contrario, diamo D rappresentano il tipo dinamico di E come segue:

  • (...)

  • Se il tipo di E è un tipo annullabile, D è il tipo sottostante di quel tipo annullabile.

• Il risultato dell'operazione dipende S e T come segue:

  • (...)

  • Se T è un tipo nullable, il risultato è vero se D è il tipo sottostante di T.

  • Se T è un tipo di valore non annullabile, il risultato è true se D e T sono dello stesso tipo.

16

su MSDN avete lista degli operatori sovraccaricabili: Overloadable Operators (C# Programming Guide)

Questi operatori non possono essere sovraccaricati:

=,,:.?, ??, ->, =>, f (x), come, controllato, non controllato, di default, delegato, è, di nuovo, sizeof, typeof

+1

forse non sto cercando il sovraccarico, ma una soluzione per il mio problema. – Cologler

+10

Dato che la tua domanda era ** "Come scavalcare' is' operator "**, mi sento come se l'onere per la mancanza di chiarezza fosse su di te, OP. – imallett

2

is operatore non è superabile controllo dell'operatore questo per saperne di più sugli operatori overridbale Operator Overloading Tutorial

+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – Teepeemm

+0

@Teepeemm ok capo: P – moji