为什么是语句(j++);禁止?

2024-01-12

下面的代码是错误的(看一下关于ideone http://ideone.com/vSoRsM):

public class Test
{
    public static void Main()
    {
        int j = 5;
        (j++);      // if we remove the "(" and ")" then this compiles fine.
    }
}

错误 CS0201:仅赋值、调用、递增、递减、等待和 new对象表达式可以用作语句

  1. 为什么当我们删除括号时代码会编译?
  2. 为什么带括号编译不通过?
  3. C# 为什么要这样设计?

深刻的见解受到赞赏。

我会尽力而为。

正如其他答案所指出的,这里发生的事情是编译器正在检测到表达正在被用作陈述。在许多语言中——C、JavaScript 和许多其他语言——使用表达式作为语句是完全合法的。2 + 2;在这些语言中是合法的,尽管这是一个无效的声明。有些表达式仅对其值有用,有些表达式仅对其副作用有用(例如调用 void 返回方法),不幸的是,有些表达式对两者都有用。 (就像增量一样。)

要点是:仅由表达式组成的语句几乎肯定是错误的除非这些表达式通常被认为其副作用比其值更有用。 C# 设计者希望找到一个中间立场,允许通常被认为有副作用的表达式,同时禁止那些通常被认为对其值有用的表达式。他们在 C# 1.0 中确定的表达式集是递增、递减、方法调用、赋值以及有些争议的构造函数调用。


旁白:人们通常认为对象构造是为了它产生的值而使用的,而不是为了构造的副作用;我认为允许new Foo();有点不对劲。特别是,我在现实代码中看到了这种导致安全缺陷的模式:

catch(FooException ex) { new BarException(ex); } 

如果代码很复杂,那么发现这个缺陷可能会非常困难。


因此,编译器会检测所有包含不在该列表中的表达式的语句。特别是,带括号的表达式被识别为 -- 带括号的表达式。它们不在“允许作为语句表达式”的列表中,因此它们是不允许的。

这一切都是为了C#语言的一个设计原则服务的。如果您输入(x++);你可能做错了什么。这可能是一个拼写错误M(x++);或者只是一些事情。请记住,C# 编译器团队的态度不是“我们能想出一些方法来完成这项工作吗?“ C#编译器团队的态度是”如果合理的代码看起来可能是错误,让我们通知开发人员”。C# 开发人员喜欢这种态度。

话虽如此,实际上在一些奇怪的情况下,C# 规范does暗示或直接声明不允许使用括号,但 C# 编译器无论如何都允许使用括号。在几乎所有这些情况下,指定行为和允许行为之间的微小差异是完全无害的,因此编译器编写者从未修复这些小错误。您可以在这里阅读相关内容:

return myVar 与 return (myVar) 之间有区别吗? https://stackoverflow.com/questions/2186595/is-there-a-difference-between-return-myvar-vs-return-myvar/2187498#2187498

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

为什么是语句(j++);禁止? 的相关文章

  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • 为什么这个 if 语句会导致语法错误

    我正在尝试设置一个 elif 语句 如果用户按下 Enter 键 代码将继续 但是我不断遇到语法错误 GTIN 0 while True try GTIN int input input your gtin 8 number if len
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到

随机推荐

  • VB.NET 中的 XML 文字可以递归吗?

    我有一堂课叫Profile它有一些简单的属性 然后它可以有一个集合配置文件项它又具有一些简单的属性 然后它可以有一个集合配置文件项 递归 现在我尝试使用 VB NET 3 5 附带的 XML Literals 生成一个非常简单的保存函数 我
  • 绑定:在“YYY”上找不到“XXX”属性,目标属性:“Xamarin.Forms.Label.Text”

    我正在使用 Xamarin Forms 和 MVVM 我在日志中收到以下内容 绑定 在 YYY 上找不到 XXX 属性 目标属性 Xamarin Forms Label Text 不确定它是否相关 但是当我更新命令函数中的变量时 该变量的更
  • React:将 props 传递给函数组件

    我有一个关于道具和功能组件的看似微不足道的问题 基本上 我有一个容器组件 它在用户单击按钮触发的状态更改时呈现模态组件 模态是一个无状态函数组件 其中包含一些需要连接到容器组件内部函数的输入字段 我的问题 当用户与无状态模态组件内的表单字段
  • IndexedDB回调不更新AngularJS中的UI

    我正在使用以下库在新的 Chrome 应用程序上访问 Angularjs 中的 IndexedDB https github com aaronpowell db js https github com aaronpowell db js
  • 左右滑动可更改活动

    所以我有一个活动 其中有一个导航抽屉 我停用了滑动以打开该导航抽屉 仅当我单击该菜单的按钮时它才会打开 现在我想通过滑动来更改活动 就像在 iPhone 中一样 我已经这样做了 但我不确定这是正确的方法 这是我的代码 GestureDete
  • Installshield - 使用 powershell 检查注册表中的密钥失败

    我有一个带有 powershell CA 的 Installshield 项目 它检查某个注册表项是否存在并根据结果设置属性 手动执行脚本时注册表检查成功但失败 返回false当从Installshield执行时 CA 在 UI 序列期间执
  • 将.apk文件发送给客户审核

    我开发了一个 Android 应用程序 并在模拟器和设备上对其进行了测试 我想将 apk文件导出到客户端进行审核 我使用应用程序清单文件导出未签名的 apk 并将其发送 但它没有安装在他的手机上 我在这里阅读了多个问题 但没有得到任何具体信
  • jwt.verify() 的 Node.js 回调

    我的 Node js 服务器上有一个身份验证路由 用于对请求进行身份验证 app get loggedin auth function req res console log req authenticated res send req a
  • SQLite eventim 的时间输入和时间退出

    我有两张桌子 DATA and EVENTS 具有以下数据 EVENTS EventIndex ObjID LocID EventData EventTime EventType 83707365 3519434 10376 0 2013
  • pandas to_numeric downcast='signed' 返回 float64

    我有一个数据集 其中 pandas read csv 处理适当地将一些连续数字列 特征 变量数据从对象转换为 float64 int64 或 uint8 但不是其他数据 因此 然后我尝试使用以下指定向下转换参数的 pandas to num
  • 如何使用 Javascript 停止 YouTube 中的视频?

    情况 here http yvoschaap com videowall q sunset 20beautiful我在那里按了一些视频 Problem 我尝试在 Firebug 控制台中通过 Javascript 停止视频 player s
  • 从另一个表和不同的数据库更新表

    基本上 我想做的是 我的第一个数据库 prc 中有一个表 users 如下所示 prc user id user 45 name user Test login user test pwd user test 在我的第二个数据库 名为 pr
  • 使用 awk 替换 CSV 文件中的列值

    我有这个文件 错误日志 00 00 00 284 501 00 00 00 417 5 5294100071980 00 00 02 463 501 00 00 05 169 501 00 00 05 529 501 00 00 05 73
  • Delphi - 通用 TList 排序

    我正在使用 Generics Collections TList 和 Sort 方法 它工作正常 但我想最后对空值或空值进行排序 按升序和降序排序 如何实施 这是我的排序功能 function TForm SortByColumn Colu
  • 按行项目条件更改 MudBlazor 表背景颜色

    我正在尝试更改 mudblazor 表中一行的颜色 问题是 我无法添加根据行元素的条件更改颜色的功能
  • WPF 中的 PagedCollectionView 等效项?

    net 3 5 或 4 0 中是否有像 Silverlight 中的 PagedCollectionView 这样的 WPF 等效类 不 没有 但你可以从这里获取 https silverlight svn codeplex com svn
  • 确定可能的项目组的算法

    我正在摸不着头脑试图做到这一点 这让我筋疲力尽 我知道事情没那么复杂 我有很多物品 这个数量可以等于或大于三 然后我需要确定完成总数的项目组的可能组合 唯一的限制是小组应该有三个或更多项目 不超过 但包括 七个项目 例如 如果我有 7 个项
  • 为单词的前 n 个字符添加下划线

    我想在链接中的单词的前几个字符下划线 类似于 CSS 第一个字母的工作方式 但字母数量可变 或者 在单词字母的前半部分下划线可能会很有用 有什么方法可以使用 HTML CSS 或 Javascript 相对简单地完成此操作吗 我不是开发人员
  • Uncrustify 折叠 多行函数调用

    我的函数调用如下所示 没有明显的原因 func a b c 有没有办法让 uncrustify 将函数折叠成一行 我已经尝试了两天了 没有断断续续的 我让它适用于函数声明 但我没有让它适用于函数调用 当我们这样做时 我也有如下所示的函数 f
  • 为什么是语句(j++);禁止?

    下面的代码是错误的 看一下关于ideone http ideone com vSoRsM public class Test public static void Main int j 5 j if we remove the and th