C# Nullable: сделать проверку нуля зависимой от другого свойства / переменной - PullRequest
2 голосов
/ 28 мая 2020

Я только что включил нулевую проверку в моем проекте. net core 3.1.

Проблема в том, что у меня есть класс ответа

public class DecryptResponse
{
    public DecryptStatus Status { get; set; }

    //This is the attribute in question
    [NotNullWhen(Status==DecryptStatus.Ok)]
    public Stream? Stream { get; set; }

    public string? ErrorMessage { get; set; }
}

public enum DecryptStatus
{
    Ok,
    InvalidData,
    KeyChecksumFailure,
    NoData,
    UnhandledError
}

В этой ситуации используется приведенное выше где метод Verify не допускает значений NULL.

Но я знаю, что поток не является нулевым, поскольку DecryptStatus==Ok

if (decryptResponse.Status != DecryptStatus.Ok)
    return (decryptResponse, null);

var verifyResponse = Verify(customerId, decryptResponse.Stream);
return (decryptResponse, verifyResponse);

Есть ли какие-либо теги, которые позволяют использовать этот logi c, или это требует серьезной переписывания кода ?

1 Ответ

0 голосов
/ 28 мая 2020

NotNullWhenAttribute используется только с параметрами. Он сообщает компилятору, что параметр (out) не равен нулю, если метод вернул указанное значение (true или false). Например,

public bool TryParse(string s, [NotNullWhen(true)] out Person person);

Это означает, что person не будет нулевым, когда метод вернет true.

Но этот атрибут не подходит для ваших целей:

  • NotNullWhen не может быть применен к свойствам класса - его можно использовать только с параметрами метода.
  • NotNullWhen не обеспечивает зависимости от некоторого внешнего значения (например, свойства класса) - он может использовать только return значение параметра метода принадлежит. Более того, это возвращаемое значение может быть только логическим.

Но вы можете попробовать использовать вместо него метод

public bool TryDecrypt(Foo bar,
    [NotNullWhen(false) out DecryptError error, // wraps error status & message
    [NotNullWhen(true)] out Stream stream)

Или используйте оператор, допускающий нулевое значение

if (decryptResponse.Status == DecryptStatus.Ok)
{
    // decryptResponse.Stream!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...