如何包含ValueTuple的结构可以满足非托管约束,但ValueTuple本身不能?

Rez*_*aei 11 .net c# generics unmanaged c#-7.3

考虑以下类型:

  • (int, int) →管理.
  • struct MyStruct { public (int,int) Value; } →不受管理!

问题:MyStruct具有托管成员的非泛型结构(int,int)已被评估为托管类型.

预期行为:包含托管成员的结构应被视为托管,与被视为托管的方式相同struct MyStruct { int? Value; }.

似乎这两种类型都与文档[1][2]相反.

示例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
    }
}
Run Code Online (Sandbox Code Playgroud)

错误CS8377类型"(INT,INT)"必须是一个非空值类型,与任何嵌套级别的所有字段一起,以便在通用类型或方法"Program.DoSomething使用它作为参数"T" ()"

示例2 - 指针或sizeof

使用上面的结构,指针或sizeof运算符的行为是相同的:

unsafe 
{
    (int, int)* p1;  // ? Compile-time error, 
    MyStruct* p2;    // ? Compiles
}
Run Code Online (Sandbox Code Playgroud)

错误CS0208无法获取地址,获取大小或声明指向托管类型的指针('(int,int)')

  1. 如果包含的结构ValueTuple被视为unmanaged并且可以满足unmanaged约束而ValueTuple被视为托管?

  2. 如何对包含struct ValueTupple<T1, T2>和struct的结构Nullable<T>进行不同的处理?


注1: IMO的问题是来自不同的建议:非托管的构造类型(由DavidG在意见中提到了),因为MyStruct是不通用的,而另一方面,同时int?(int,int)两者都管理,但struct MyStruct { int? Value; }struct MyStruct { (int, int) Value; }评价不同.

Jar*_*Par 7

谢谢你的报道.这只是编译器中的一个错误.用作字段时的元组应该注册为泛型类型,因此在一个字段中无效unmanaged type.它似乎正在评估为郁金香而不是这个支票.

好消息是,在C#8.0中,这种限制将会消失.类型(int, int)是有效的unmanaged type.