2011-10-09 4 views
2

J'ai une classe d'encapsulation de construction destinée à empêcher les types de référence d'être nul, en tant que contrat de code de pré-condition.Conversion automatique de l'encapsuleur en C#

public sealed class NotNullable<T> 
    where T : class 
{ 
    private T t; 

    public static implicit operator NotNullable<T>(T otherT) 
    { 
     otherT.CheckNull("Non-Nullable type"); 
     return new NotNullable<T> {t = otherT}; 
    } 

    public static implicit operator T(NotNullable<T> other) 
    { 
     return other.t; 
    } 

} 

Cela fonctionne finement, mais un casting est toujours nécessaire comme lorsqu'ils traitent avec Nullable:

public void Foo(NonNullable<Bar> bar) 
{ 
    Console.WriteLine((Bar)bar); 
} 

Serait-il possible d'avoir le paramètre de se comporter de type nonnullable comme si elle était de type T, sans avoir à le lancer? Comme dans SpeC#:

public string Foo(Bar! bar) 
+2

oui et non, oui - si vous écrivez votre propre compilateur/pré-processeur ... non si vous utilisez simplement C# comme AFAIK ... – Yahia

+2

Qu'en est-il d'un wrapper 'null'? – SLaks

Répondre

1

Vous pouvez éviter la coulée en faisant l'objet lui-même accessible via une propriété Value, mais il peut se demander si c'est mieux que le jeter:

Console.WriteLine(bar.Value); 

Il y a même astuces que vous pouvez utiliser pour dire à des outils comme ReSharper que cette valeur n'est pas nulle, soit via XML ou des annotations dans le code:

[NotNull] 
public T Value { get { return t; } }