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
}