действиевыдает ошибку компиляции, но делегат void TestMeDelegate (Span <byte>data) не - PullRequest
0 голосов
/ 14 сентября 2018

Проверьте следующий код.

class Program
{
    delegate void TestMeDelegate(Span<byte> data);

    static void Main(string[] args)
    {
        TestMeDelegate testMeDelegate = TestMe;
        Action<Span<byte>> testMeAction = TestMe;
    }

    static void TestMe(Span<byte> data)
    {
    }
}

Строка, использующая testMeDelegate, работает, но строка, использующая testMeAction броски

Тип 'Span<byte>' нельзя использовать в качестве аргумента типа

Я нацеливаюсь на.net 4.7.2 с помощью nuget System.Memory версии 4.5.1

Langversion установлен на C #, последняя младшая версия (последняя) должна быть 7.3

Вопросы:

Это просто ошибка компилятора?

В чем различия между действием и делегатом в этом сценарии?

1 Ответ

0 голосов
/ 14 сентября 2018

Это именно так, как описывает ошибка.

Тип Span<T> - это ref struct, то есть его хранилище может находиться только в стеке (т.е. не в куче).Компилятор выведет диагностику для случаев, когда это не может быть гарантировано.

Проблема в том, что компилятор не может определить это с помощью обобщений.Хотя есть некоторые ситуации, которые компилятор может обнаружить (например, вашу), команда компиляторов решила вообще не разрешать использование ref struct типов в качестве универсальных типов.

Я не знаю точных причинпочему они не проверяют это должным образом для универсальных типов, но я могу себе представить, что:

  • слишком сильно увеличит сложность компилятора
  • Это будет очень сложно,если вообще возможно, генерировать правильные диагностические сообщения для случаев, когда тип не может использоваться в качестве общего параметра для данного типа.
...