Почему делает MemoryStream. GetBuffer () всегда бросают?

Вы можете сделать это, но вам нужно сделать немного хитрости:

newtype Fix f = In{out:: f (Fix f)}

Вы можете определить Cata впоследствии:

Cata :: (Functor f) => (f a -> a) -> Fix f -> a
Cata f = f.(fmap (cata f)).out

Это определит общий катаморфизм для всех функторы, которые вы можете использовать для создания своих собственных вещей. Пример:

data ListFix a b = Nil | Cons a b
data List a = Fix (ListFix a)
instance functor (ListFix a) where
fmap f Nil = Nil
fmap f (Cons a lst) = Cons a (f lst)
18
задан I. J. Kennedy 29 October 2009 в 19:59
поделиться

4 ответа

Здесь находится документация для конструктора MemoryStream (byte []) , который вы используете. В нем конкретно говорится:

Этот конструктор не раскрывает базовый поток. GetBuffer выдает исключение UnauthorizedAccessException.

Вместо этого следует использовать this конструктор с publiclyVisible = true .

36
ответ дан 30 November 2019 в 06:39
поделиться

Чтобы добавить к тому, что другие уже добавили сюда ...

Другой способ заставить ваш код работать - это изменить ваш код на следующую строку.

byte[] buf2 = ms.ToArray();
3
ответ дан 30 November 2019 в 06:39
поделиться

Похоже, вы используете MemoryStream (array []) , который не соответствует ни одной из трех версий, упомянутых в документации. .

2
ответ дан 30 November 2019 в 06:39
поделиться

Проверьте документы для MemoryStream.GetBuffer ()

Чтобы создать экземпляр MemoryStream с публично видимый буфер, используйте MemoryStream, MemoryStream (Byte [], Int32, Int32, Boolean, Boolean) или MemoryStream (Int32). Если нынешний размер потока можно изменять, два вызова этого не возвращают тот же массив, если размер базового байтового массива изменяется между звонками. Для дополнительных информацию см. в разделе Емкость.

Необходимо использовать другой конструктор.

6
ответ дан 30 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: