正如Microsoft Dynamics AX 2009编程:入门一书中所述,需要在x ++中声明后添加分号:
只要第一行代码不是关键字,变量声明后的额外分号就是强制性的。分号告诉编译器变量声明已经结束。在分号后面不能声明新变量。
(直接从书中复制,不变,如果需要我会将其删除)
但是,当我删除分号并运行作业时,绝对没有错误或问题:
static void Job1(Args _args)
{
str string1 = "STACKOVERFLOW";
;
print string1;
pause;
}
就像
static void Job2(Args _args)
{
str string1 = "STACKOVERFLOW";
print string1;
pause;
}
真的需要吗?我应该习惯使用它吗?
它的解释相当优雅here。
一个关键的引用[强调我的]:
“你需要额外分号的原因是因为编译器不能总是看到变量声明的结束位置。如果你没有帮助,它会猜测。而且猜测并不是很好。”
当编译器正在分析代码时,它会检查一行上的第一个单词是否与类型名称(AOT对象)匹配。如果它是类型名称,则编译器将该行视为变量声明。在这种情况下,变量名称应该是下一个。
随着AX 2012的发布,没有必要在变量声明后添加额外的分号。
如果代码的主体不是以关键字开头,则只需要分号。在您的示例中,您的代码以print
开头,string1+=".COM";
是内置关键字。如果您曾尝试使用以下命令启动代码:mfp's two cents: What's up with this semicolon?,您将收到错误消息。
Dynamics AX 2009是AX的最后一个版本,需要额外的分号。 AX 6.0应该解决这个问题:void method1()
{
CustTable custTable;
custTable = CustTable::find("cust");
}
你真的不需要可爱的分号(你没有得到编译错误)当声明后的下一个单词(如果有的话)不是compilator识别的某个关键字,如类型(EDT,表,类,... )
例如:
void method1()
{
CustTable custTable;
if (custTable)
{
// stuff happens
}
}
错误!因为编译器不能分离X ++代码开头的类声明块。当编译器读取第二行时,它不知道custTable是新变量还是X ++代码的一部分。所以,你需要额外的分号来说明编译器在哪里是声明的结尾(实际上,X ++代码的起点在哪里)。
if
作品!因为编译器知道你不能声明一个类型为CustTable method1()
{
custTable = CustTable::find("cust"); // custTable may exists in the context
return custTable;
}
的变量(显然它是一个保留关键字),所以很明显这是X ++代码的开头,你不能在这一行之后声明变量。
即使没有变量声明,这也是这样的:
custTable
错误! CustTable method1()
{
return CustTable::find("cust");
}
可能是一个decaration,或者像这个例子的X ++代码。
return
作品!因为void method1()
{
info("This should work, ya?");
}
不能作为声明。
额外:
info
这应该工作(因为info
不是一种类型),不是吗? ......但它没有!为什么?因为Global::info()
是一个特殊的内核方法,将被替换为它的全名:Global
,在预编译器替换后第一个令牌将是Global
,而qazxswpoi是一个类。