将 TArray 类型转换为 X 数组是否安全?

2024-01-18

今天我发现了一个编译器错误(QC#108577 http://qc.embarcadero.com/wc/qcmain.aspx?d=108577).

以下程序无法编译:

program Project1;
{$APPTYPE CONSOLE}

procedure P(M: TArray<TArray<Integer>>);
begin
  SetLength(M, 1, 2);
end;

begin
end.

编译器对此嗤之以鼻SetLength线并说:

[dcc32 Error] E2029 ')' expected but ',' found

我知道我可以这样修复它:

procedure P(M: TArray<TArray<Integer>>);
var
  i: Integer;
begin
  SetLength(M, 1);
  for i := low(M) to high(M) do
    SetLength(M[i], 2);
end;

但我自然希望避免诉诸于此。

以下变体可以编译并且似乎可以工作:

procedure P(M: TArray<TArray<Integer>>);
type
  TArrayOfArrayOfInteger = array of array of Integer;
begin
  SetLength(TArrayOfArrayOfInteger(M), 1, 2);
end;

我对动态数组的实现细节了解不够,TArray<T>转换、引用计数等以确保这是安全的。

有没有人知道足够多的知识来以某种方式说出这是否会在运行时产生正确的代码?


编译器内部过程SetLength在堆栈上动态构造一个维度数组并调用DynArraySetLength对于任何动态数组,无论是否通用。如果通用数组在结构上与常规动态数组不兼容,则可能不会调用用于设置长度的相同实现。

In fact 文档 http://docwiki.embarcadero.com/Libraries/en/System.DynArraySetLength of DynArraySetLength offers SetLength作为多维数组的替代方案。DynArraySetLength也可以用来代替类型转换,但我看不出有任何理由更喜欢其中之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 TArray 类型转换为 X 数组是否安全? 的相关文章

随机推荐

  • 在 Access 中导入 .sql 文件

    我需要导入使用 MySql 创建的 sql 数据库备份文件 有办法执行此操作吗 您无法将 MySQL 备份恢复到任何其他数据库系统中 如果要将 MySQL 数据导入到 Access 中 可以将其全部导出到 CSV 文件中 然后将其导入到 A
  • UWP TextBox 文本绑定不起作用

    我在 UWP 中使用 TextBox Text 绑定时遇到一些问题 我已经从事 WPF 多年 通常知道我在 XAML 中做什么 但无法让此绑定发挥作用 我在 XAML 中的同一范围内有一个文本框和一个按钮
  • 如何避免打开两个浏览器窗口?

    我想避免打开两个应用程序窗口 或选项卡 的可能性 是的 如果我的应用程序 LAMP Javascript 安装在http www domain com并且用户正在浏览页面http www domain com user 他 她无法打开另一个
  • 是否可以将 .Net DLR 托管在“防白痴”沙箱中?

    我想以这样一种方式托管动态语言运行时 DLR 以便在其中运行任意脚本的用户无法关闭该进程 The DLR 托管规范 https web archive org web 20110814193317 http dlr codeplex com
  • pthread_create() 的返回码是 11

    我正在尝试运行一个简单的多线程编程 但我从 gcc 收到此错误 pthread create 的返回码是 11 我该如何解决这个问题 include
  • 平面图布局

    布局图形时有哪些边缘重叠最小化技术 最好与 GraphViz 相关 还有现有的软件可以以平面方式布局图形吗 当前布局 http www evecakes com doodles master gif http www evecakes co
  • PHP 中奇怪的回显、打印行为?

    以下代码输出43211 why echo print 3 2 print 4 你的语句解析对人类如下 回显由以下内容组成的串联字符串 函数的结果print 3 这将返回 true 它被字符串化为1 字符串 2 函数的结果print 4 这将
  • 如何在子流程中包含弹出对话框

    有没有办法在子流状态内调用对话框 以便禁用背景 当前流 这样当子流程结束时 关闭弹出对话框后 它就可以更新父流程 当前页面 我正在尝试使用子流程实现如下图所示的效果 Update 最后 我在 webflow 中使用了以下代码来动态生成对话框
  • amphp 是如何工作的

    他们网站上的文档http amphp org faq http amphp org faq我不太清楚 事情让我很困惑 它打算作为服务器运行吗 或作为 CLI 运行 或者在 Web 容器 apache nginx fpm 中运行 php 本质
  • 收到错误:图形 API 版本不匹配

    当我运行时出现以下错误shiny Error Graphics API version mismatch Listening on http 127 0 0 1 3774 Warning Error in Cairo Graphics AP
  • Collections.sort() 比较方法违反了 Java 中的一般约定[重复]

    这个问题在这里已经有答案了 我知道这种问题已经被问过数百万次 如果不是数十亿次 但我还找不到答案 This compare 方法没有Long Double Float 它只有Date boolean and Null检查员 但是它告诉我co
  • 如何获取和设置 EmguCV Mat 图像的像素值?

    我正在使用 OpenCV 3 0 库的 EmguCV 3 0 0 包装器 我正在使用Mat在几个地方上课 这是一个单通道 8x8 图像的示例double values Mat image new Mat 8 8 DepthType Cv64
  • 主键中允许 NULL - 为什么以及在哪个 DBMS 中?

    进一步我的问题 为什么在 SQL 中使用 非空主键 https stackoverflow com questions 3905703 why to use not null primary key in tsql As I underst
  • 学习 monodevelop 并且无法显示消息框

    我正在 monodevelop 工作并学习 c 我试图显示一个消息框 但无法使其正常运行 这是我的代码 using System using Gtk using GtkSharp public partial class MainWindo
  • SwiftUI:VStack/HStack/ZStack 拖动手势不起作用

    我不明白为什么DragGesture不适用于 VStack HStack ZStack 考虑以下简单示例 struct ContentView View State private var offset CGSize zero var bo
  • Vista/Win2008 上的关键部分泄漏内存?

    看来在 Vista Windows Server 2008 中大量使用关键部分会导致操作系统无法完全重新获得内存 我们在 Delphi 应用程序中发现了这个问题 这显然是因为使用了 CS API 看这个所以问题 https stackove
  • 将 swf 转换为 mp4

    这个答案没有帮助 将压缩的 swf 转换为 mp4 https stackoverflow com q 20194270 630169 尝试转换 swf 文件 ffmpeg 输出 ffmpeg i GTDS demo new swf GTD
  • 如何使 spring @retryable 可配置?

    我有这段代码 Retryable maxAttempts 3 stateful true include ServiceUnavailableException class exclude URISyntaxException class
  • jquery读取嵌套的json

    我有以下 json 如下所示 我正在尝试读取值 TOP1 TOP2 我有点不确定该怎么做 我正在使用以下内容 但这只会给我一个包含 TOP1 和 TOP2 嵌套对象的对象 如何获取 TOP1 和 TOP2 值 getJSON http lo
  • 将 TArray 类型转换为 X 数组是否安全?

    今天我发现了一个编译器错误 QC 108577 http qc embarcadero com wc qcmain aspx d 108577 以下程序无法编译 program Project1 APPTYPE CONSOLE proced