Автоматическое преобразование оболочки в C # - PullRequest
2 голосов
/ 09 октября 2011

Я создал класс-оболочку, предназначенный для предотвращения того, чтобы ссылочные типы были нулевыми, как контракт кода предварительного условия.

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;
    }

}

Это прекрасно работает, но всегда требуется приведение типа, как при работе с Nullable:

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

Возможно ли, чтобы параметр типа NonNullable вел себя так, как если бы он был типа T, без его приведения? Как в Spec #:

public string Foo(Bar! bar)

1 Ответ

1 голос
/ 09 октября 2011

Вы можете избежать приведения, сделав сам объект доступным через свойство Value, но спорным является ли это лучше, чем приведение к нему:

Console.WriteLine(bar.Value);

Есть даже хитрости, которые можно использовать, чтобы сообщить таким инструментам, как ReSharper, что это значение не равно нулю, ни через XML, ни внутри кодовые аннотации:

[NotNull]
public T Value { get { return t; } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...