- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们知道这两个加法语句是等价的,编译成相同的IL代码:
int x = 100;
x += 100;
x = x + 100;
但是,当需要显式强制转换时,我注意到了一些奇怪的事情:
byte b = 100;
b += 200; // Compiles (1)
b = b + 200; // Cannot implicitly convert int to byte (2)
b = (byte) (b + 200); // Compiles (3)
很明显为什么第二条语句需要显式转换,因为加法的结果是一个整数。但对我来说奇怪的是第一句话。它编译为与第三条语句完全相同的 IL,因此看起来编译器为我们添加了一个应该是显式的强制转换。但是在第二个语句中做不到。
这对我来说似乎是矛盾的,因为我希望第一个语句等同于第二个并且永远不会编译,那么为什么它会编译呢?
注意:当需要从 long
到 int
的显式转换时,这不会编译:
int x = 100;
long y = 200;
x += y;
最佳答案
你真的需要去 specs对于这类信息(并且很难理解措辞)。然而,直接从马嘴里说出来
12.18.3 Compound assignment
An operation of the form
x op= y
is processed by applying binary operator overload resolution (§12.4.5) as if the operation was writtenx op y.
Then,
If the return type of the selected operator is implicitly convertible to the type of
x
, the operation is evaluated asx = x
, except that x is evaluated only once.
op yOtherwise, if the selected operator is a predefined operator, if the return type of the selected operator is explicitly convertible to the type of
x
, and ify
is implicitly convertible to the type ofx
or the operator is a shift operator, then the operation is evaluated asx = (T)(x op y)
, whereT
is the type ofx
, except thatx
is evaluated only once.- Otherwise, the compound assignment is invalid, and a binding-time error occurs.
...
blah blah blah
...
The second rule above permits
x op= y
to be evaluated asx = (T)(x op y)
in certain contexts. The rule exists such that the predefined operators can be used as compound operators when the left operand is of typesbyte
,byte
,short
,ushort
, orchar
. Even when both arguments are of one of those types, the predefined operators produce a result of type int, as described in §12.4.7.3. Thus, without a cast it would not be possible to assign the result to the left operand.The intuitive effect of the rule for predefined operators is simply that
x op= y
is permitted if both ofx op y
andx = y
are permitted.byte b = 0;
char ch = '\0';
int i = 0;
b += 1; // Ok
b += 1000; // Error, b = 1000 not permitted
b += i; // Error, b = i not permitted
b += (byte)i; // Ok
ch += 1; // Error, ch = 1 not permitted
ch += (char)1; // Okthe intuitive reason for each error is that a corresponding simple assignment would also have been an error.
简而言之,计算机说不。
关于c# - 为什么 x = x + 100 与编译为相同 IL 的 x += 100 的处理方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52240649/
如果我运行 .NET 编译器,它会生成一个包含中间语言代码 (IL) 的文件,并将其放入一个 .exe 文件(例如)。 如果我使用像 ildasm 这样的工具,它会再次显示 IL 代码。 但是,如果我
我正在努力寻找将为对象创建引用的位置以及将在哪个阶段创建它从程序到中间代码或中间代码到 native 代码. 最佳答案 This article might help : Typically, app
我正在尝试将这个简单的类转换为 IL 代码: public class IL { Dictionary props = new Dictionary() { {"1",1} }; } 事实上,在尝
我一直在查看有关 CLR Profiling API 的一些文章,其中许多文章都谈到调用 SetILFunctionBody() 来进行实际的 IL 重写;但是,这些文章都没有真正解释您可以使用什么来
C# 编译成 IL,然后很容易使用 ILSpy 或 dotPeek 反编译回 C#。 是否有任何工具可以将相同的 IL 反编译成 F#? 即是否有一种通过 IL 将 C# 转换为 F# 的偷偷摸摸的方
像 C# 方法 IL 一样发出 IL 但获取 System.InvalidProgramException:公共(public)语言运行时检测到无效程序。 示例: public static
我想为多线程应用程序生成 IL。作为第一步 我编写了一个简单的应用程序并使用 ILSpy 检查并生成了 IL。 public class ThreadTesting { public stat
是否有任何以 VS 插件或独立应用程序形式存在的 IL 级调试器? Visual Studio 的调试器很棒,但它允许您在 HLL 代码级别或汇编语言上进行调试,您无法调试 IL。 在某些情况下,有机
我已经编辑了简化它的问题 我有一个在这样的域中工作的应用程序: http://localhost:8092/myapp 如果我访问 http://localhost:8092/myapp/ticket
我正在使用2个选择标签。它们的内容可以在网页内修改(通过javascript)。 默认情况下,grails仅采用选定的选项(如果启用了多个,则为所有选定的选项),并将其传递给 Controller
您好,我试图通过grails在Windows控制台中运行一些命令。我这个代码 def pruebaMail() { "mkdir C:\\pruebaMail".execute()
这在html中工作正常,但在gsp中却不能。 反馈: GET http://translate.google.com/translate_tts?ie=utf-8&tl=en&q=hello%20w
我一直在研究 IL,我注意到类似 Prefix1 的操作码,文档基本上告诉我不用担心。当然,这让我很好奇这些不同的前缀操作码实际上是做什么的。谷歌快速搜索没有找到任何结果,所以我想我应该问问这里的专家
我是个新手。我现在在我的域类中遇到问题。我有3个域类,患者类,护士类和 NursePatient类, NursePatient类类是一个复合键,您可以在其中查看谁是患者的主治护士,因此,如果您查看其表
当我尝试从参数分配值时,它现在无法正常工作。 System.out.println(params.test) // I see 0 int test = params.test System.ou
如果我有一个程序集,我想更新一些文件,我需要用什么工具来执行此操作? 例如,在 java 中,可以解压缩 jar 文件更新所需的 .class 并重新压缩 jar。我怎样才能在 .NET 中完成同等的
public static class Extensions { public static T Include(this System.Enum type,T value) where T:
因此我需要对 DLL 文件进行非常简单的更改。 我已经使用 Reflector 成功地将 dll 文件导出为 IL 语言,并且找到了我需要进行的更改(它只是更改了一个 URL)。因此,如果我在记事本中
更多地考虑这是一个学术问题而不是实际问题。 在重新发明轮子时,即编写一个迷你 ORM/类型映射器时,我发出了一些 IL 以将对象的属性转换为添加到 SqlCommand 的 SqlParameters
很难学习“ float ”、“溢出”、“清除”和其他一些属性,所以请帮我找到好的在线网站来学习这些属性.. 我打开了一些网站来制作类似我发现的设计 http://wix.com我很欣赏它的导航栏,所以
我是一名优秀的程序员,十分优秀!