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:
- se
NotNull<>
è di classe,default(NotNull<>)
è nullo, non faccio nulla. - se
NotNull<>
è struct,default(NotNull<>).Value
è nullo.
scusa per la domanda.
'is' non è un gestore che esegue l'override. – PetSerAl
@PetSerAl rendi questo in una risposta (non ce n'è altri) in modo che la domanda possa essere chiusa – Carsten
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