【问题标题】:Difference between unmanaged and struct constraints in c# genericsc#泛型中非托管和结构约束之间的区别
【发布时间】:2019-03-06 06:17:53
【问题描述】:

where T : struct - 这里 T 必须是值类型。

where T : Unmanaged - 这里的 T 不能是引用类型。

如果struct和unmanaged都用于值类型,有什么区别?

【问题讨论】:

  • 您是否查看过这方面的文档,您对哪一部分感到困惑?
  • 从 C# 7.3 开始,您可以使用非托管约束来指定类型参数必须是非托管类型。非托管类型是一种非引用类型并且在任何嵌套级别都不包含引用类型字段的类型。非托管约束使您能够编写可重用例程来处理可作为内存块操作的类型

标签: c# generics


【解决方案1】:

根据https://blog.jetbrains.com/dotnet/2018/07/19/unmanaged-delegate-enum-type-constraints-c-7-3-rider-resharper/

为了满足非托管约束,类型必须是结构体 并且该类型的所有字段必须属于以下之一 类别:

  • 类型有 sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、IntPtr 或 UIntPtr。
  • 是枚举类型。
  • 是指针类型。
  • 成为满足非托管约束的用户定义结构。

所以非托管约束比结构约束更具约束力。

【讨论】:

    【解决方案2】:

    泛型类型 T 的非托管约束强制该类型为 不递归包含引用类型的“非托管”结构 字段。 C# 语言中存在“非托管类型”的概念 找了很久,在C#语言里都能找到这个词 规范和官方文档中,但现在编译器 实际上可以强制执行。

    更多信息,您可以在微软官方博客中找到。 https://blogs.msdn.microsoft.com/seteplia/2018/06/12/dissecting-new-generics-constraints-in-c-7-3/

    【讨论】:

      【解决方案3】:

      为了便于理解:
      struct 表示不接受引用类型,它只接受“值类型”。
      Unmanaged 表示只接受纯值类型,不能包含任何引用类型部分。

      例如:

      struct MyStruct
      {
          public int f1;
          public string f2;
      }
      

      此结构在struct 约束中是合法的,但在unmanaged 约束中是非法的。

      【讨论】:

        猜你喜欢
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        相关资源
        最近更新 更多