C# 为什么包含ValueTuple的结构可以满足非托管约束,而ValueTuple本身却不能?

C# 为什么包含ValueTuple的结构可以满足非托管约束,而ValueTuple本身却不能?,c#,.net,generics,unmanaged,c#-7.3,C#,.net,Generics,Unmanaged,C# 7.3,考虑以下类型: (int,int)→ 管理 struct MyStruct{public(int,int)Value;}→ 不受管理 问题:具有托管成员(int,int)的非泛型结构MyStruct 预期行为:包含托管成员的结构应被视为托管,就像struct MyStruct{int?Value;}被视为托管一样 似乎这两种类型的行为都违反了文件和规则 示例1-非托管约束 class Program { static void DoSomething<T>() where

考虑以下类型:

  • (int,int)
    → 管理
  • struct MyStruct{public(int,int)Value;}
    → 不受管理
问题:具有托管成员
(int,int)
的非泛型结构
MyStruct

预期行为:包含托管成员的结构应被视为托管,就像
struct MyStruct{int?Value;}
被视为托管一样

似乎这两种类型的行为都违反了文件和规则

示例1-非托管约束

class Program
{
    static void DoSomething<T>() where T : unmanaged { }
    struct MyStruct {  public (int, int) Value; }
    static void Main(string[] args)
    {
        DoSomething<MyStruct>();    // → OK
        DoSomething<(int, int)>();  // → Shows compile-time error
    }
}
错误CS0208无法获取的地址、大小或声明 指向托管类型(“(int,int)”的指针

问题

  • ValueTuple
    被视为托管时,包含
    ValueTuple
    的结构如何被视为
    unmanaged
    并满足
    unmanaged
    约束

  • 如何区别对待具有
    valuetuple
    的结构和包含
    Nullable
    的结构



  • 注1:在我看来,这个问题与(DavidG在评论中提到的)不同,因为
    MyStruct
    不是通用的,而
    int?
    (int,int)
    都是管理的,但是
    struct MyStruct{int?值;}
    struct MyStruct{(int,int)值;}
    评估结果不同。

    感谢您的报告。这只是编译器中的一个bug。元组用作字段时应注册为泛型类型,因此在
    非托管类型中无效。它似乎是作为一个薄纱而不是评估,并错过了这项检查


    好消息是,在C#8.0中,这一限制将消失。类型
    (int,int)
    是有效的
    非托管类型

    是的,但这个问题是关于非托管构造类型的,我猜元组也属于同一个括号。我认为这个问题是编译器中需要修复的bug。有趣的事实是:Resharper将第一行(
    DoSomething()
    )视为相同的错误。当然,这是一个不同的问题,我只是觉得分享很有趣。我相信这是一个编译器错误。我建议在Rosyln Report上发行一期谢谢!它似乎是作为一个
    元组进行计算的。。。→ 您的意思是作为非泛型结构进行评估吗?因为如果它是作为
    Tuple/ValueTuple
    计算的,因为它们是托管类型,那么
    struct MyStruct{(int,int)Value;}
    应该作为
    managed
    计算,而它是作为
    非托管的
    计算的。
    unsafe 
    {
        (int, int)* p1;  // → Compile-time error, 
        MyStruct* p2;    // → Compiles
    }