2010-11-22 5 views
3

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

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

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

ответ

16

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

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

public MemoryStream GetResponseStream() { ... } 

и ваш вызов метода, как это:

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

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

1

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

0

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

0

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

public MemoryStream GetResponseStream() 
{ 
    return(null); 
} 
0

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

Смежные вопросы