1

检查以下代码。

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>”不能用作类型参数

我的 target.net 4.7.2 和 System.Memory nuget 版本 4.5.1

Langversion 设置为 C# latest 次要版本(latest)应该是 7.3

问题:

这只是一个编译器错误吗?

在这种情况下,Action 和 delegate 有什么区别?

4

1 回答 1

4

这与错误描述的完全一样。

Span<T>类型是 a ,这ref struct意味着它的存储位置只能在堆栈上(所以不能在堆上)。如果无法保证,编译器将输出诊断信息。

问题是编译器无法用泛型确定这一点。尽管编译器可以检测到某些情况(例如您的情况),但编译器团队已决定根本不允许将ref struct类型用作泛型类型。

我不知道他们没有正确检查泛型类型的确切原因,但我能想象的一些是:

  • 会增加编译器的复杂性太多
  • 如果可能的话,对于不能将类型用作给定类型的泛型参数的情况生成正确的诊断消息将非常困难。
于 2018-09-14T11:32:27.437 回答