Почему я не могу объявить MemoryStream обнуляемым (MemoryStream?), Когда функция может вернуть MemoryStream? - PullRequest
3 голосов
/ 22 ноября 2010

У меня есть функция, которая возвращает MemoryStream?. Так что null, если произошла ошибка. Затем я обнаружил, что не могу объявить переменную MemoryStream?

public MemoryStream? GetResponseStream() { }
MemoryStream? stream = GetResponseStream();

Тип 'System.IO.MemoryStream' должен быть типом значения, не допускающим значения NULL, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'System.Nullable'

Ответы [ 5 ]

16 голосов
/ 22 ноября 2010

MemoryStream является ссылочным типом (объявленным с ключевым словом class) и, следовательно, уже обнуляется сам по себе.Только типы значений (объявленные с ключевым словом struct) не могут быть обнулены и могут быть обнулены с помощью ?.

Таким образом, ваш метод должен выглядеть следующим образом:

public MemoryStream GetResponseStream() { ... }

иВаш вызов метода выглядит следующим образом:

MemoryStream stream = GetResponseStream();
if (stream == null) { ... }

Кстати: вы можете рассмотреть возможность использования исключений, чтобы указать, что ошибка произошла в GetResponseStream, а не возвращать null.

1 голос
/ 22 ноября 2010

MemoryStream является ссылочным типом, поэтому может быть нулевым. Только * типы значений могут быть преобразованы в Nullable<T>, так как в противном случае им не может быть присвоено нулевое значение.

0 голосов
/ 22 ноября 2010

Модификатор Nullable (?) Предназначен для использования только с типами значений.Поток - это тип объекта, который всегда может быть установлен в null (по своей природе он уже «обнуляемый»).Так что вам не нужно делать то, что вы пытаетесь сделать.

0 голосов
/ 22 ноября 2010

Нет необходимости в ?, так как ссылочные типы могут быть null.

public MemoryStream GetResponseStream()
{
    return(null);
}
0 голосов
/ 22 ноября 2010

Обнуляемыми могут быть только типы значений, а не ссылочные типы.MemoryStream уже может иметь значение null, поэтому не имеет смысла делать его обнуляемым

...