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 - 非托管约束
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)')
题
如果包含的结构ValueTuple被视为unmanaged并且可以满足unmanaged约束而ValueTuple被视为托管?
如何对包含struct ValueTupple<T1, T2>和struct的结构Nullable<T>进行不同的处理?
注1: IMO的问题是来自不同的建议:非托管的构造类型(由DavidG在意见中提到了),因为MyStruct是不通用的,而另一方面,同时int?与(int,int)两者都管理,但struct MyStruct { int? Value; }和struct MyStruct { (int, int) Value; }评价不同.
谢谢你的报道.这只是编译器中的一个错误.用作字段时的元组应该注册为泛型类型,因此在一个字段中无效unmanaged type.它似乎正在评估为郁金香而不是这个支票.
好消息是,在C#8.0中,这种限制将会消失.类型(int, int)是有效的unmanaged type.