`
RednaxelaFX
  • 浏览: 3023377 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

FGAB问题——C#的语法二义性

    博客分类:
  • C#
阅读更多
C# Annotated Standard的第78页上有一段关于C# 2.0的语法二义性的描述和解释。

其中提到一个所谓FGAB的例子:
引用
F(G<A, B>(7));

没有特殊规定的话,这个语句可以被解释为两种意思:
1、F是一个接受两个bool型参数的方法,而这里的两个实参分别是G<A和B>(7);
2、F是一个接受一个参数的方法,参数类型与G的返回值类型匹配;G则是带有两个泛型参数的、接受一个形式参数的方法,这里泛型参数分别是A和B,实际参数是7。

为了解决这个二义性,ECMA-334 C# 4th Edition里有这样的规定:如果一串token可以被解析为以type-argument-list结束的simple-namemember-accesspointer-member-access,则紧接着结束的>的token会被检验。如果是:
( } ] : ; , . ? == !=

的其中一个,那么type-argument-list就属于simple-namemember-accesspointer-member-access的一部分,其它可能的解析方式都无效。反之则type-argument-list不属于前面的simple-namemember-accesspointer-member-access的一部分,即使没有任何其它有效的解析方式。
(同一段规定在微软的C# 3.0规范的7.5.4.2小节里也有。)
也就是说前面的
F(G<A, B>(7));

应该被解析为第二种解释,而:
F(G<A, B>7);

应该被解析为第一种解释。

C# Annotated Standard一书中对这个规定有详细的解释,为什么要选定这组token作为特殊规定的对象呢——通过合理的follow set来消除二义性。详细还是直接读书吧,这里就不说了。
不过书中给的一个相关例子很明显已经过时了。这里例子与规范里用的FGAB例子相似,说以下代码用微软.NET和Mono的C#编译器无法编译:
Peter Golde 写道
public class ShouldCompile {
    public static void Main( string[ ] args ) {
        int G = 1, A = 2, B = 2;
        int blah = F( G<A, B>>7 );
    }

    public static int F( bool b, int i ) {
        return 42;
    }
}

用微软的C# 2.0编译器来编译确实是无法通过:
引用
D:\experiment>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc fgab.cs
Microsoft (R) Visual C# 2005 编译器 版本 8.00.50727.3053
用于 Microsoft (R) Windows (R) 2005 Framework 版本 2.0.50727
版权所有(C) Microsoft Corporation 2001-2005。保留所有权利。

fgab.cs(4,25): error CS0246: 找不到类型或命名空间名称“A”(是否缺少 using
        指令或程序集引用?)
fgab.cs(4,28): error CS0246: 找不到类型或命名空间名称“B”(是否缺少 using
        指令或程序集引用?)
fgab.cs(4,23): error CS0307: 变量“G”不能与类型参数一起使用


但那都是几年前的编译器了啊……用去年出的C# 3.0编译器就没问题:
引用
D:\experiment>C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc fgab.cs
适用于 Microsoft(R) .NET Framework 3.5 版的 Microsoft(R) Visual C# 2008 编译器 3.5.30729.1版
版权所有(C) Microsoft Corporation。保留所有权利。


用最近发布的Mono 2.0.1也一样没问题。其中的mcs:
引用
D:\experiment>mcs fgab.cs
fgab.cs(4,13): warning CS0219: The variable `blah' is assigned but its value is never used
Compilation succeeded - 1 warning(s)

用gmcs:
引用
D:\experiment>gmcs fgab.cs
fgab.cs(4,13): warning CS0219: The variable `blah' is assigned but its value is never used
Compilation succeeded - 1 warning(s)
分享到:
评论

相关推荐

    2024嵌入式面试资料FreeRTOS基本使用

    2024嵌入式面试资料FreeRTOS基本使用提取方式是百度网盘分享地址

    面向对象程序设计题目集

    仅提供示例代码

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本116.0.5796.0)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom116.0.5796.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver116.0.5796.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    pycharm的使用技巧

    PyCharm官网本身并不直接提供使用技巧,但PyCharm作为一款强大的Python集成开发环境(IDE),确实有许多实用的使用技巧可以帮助开发者更高效地进行编程。以下是一些常用的PyCharm使用技巧,供您参考: 设置代码字体和界面文字大小: 进入File > Settings(或使用Ctrl+Alt+S快捷键)。 在搜索框中输入“font”找到字体设置。 在“Font”下设置代码字体大小,建议18或20。 如需调整菜单界面文字大小,进入“Appearance”并勾选“Use custom font”,然后设置大小。 快速多行注释或取消注释: 选中多行代码,按Ctrl+/进行多行代码的注释或取消注释。 代码格式化: 使用Ctrl+Alt+L快捷键自动格式化代码,提高代码可读性。 快速修改变量或类名: 选中需要重新命名的变量或类名,右键选择Refactor > Rename,进行全局修改。 快速查找变量、函数等: 使用Ctrl+F快捷键调出查找框,输入关键字进行查找。 更改编辑器字体: 除了在“Settings”中设置外,还可以直接在“Preferences” > “Editor”

    一个用于个人学习的数据分析资源包

    数据分析资源包介绍 本资源包汇聚了数据分析领域的核心工具和资源,为数据科学家、分析师和爱好者提供一站式解决方案。内含多种数据处理和分析软件、算法库、可视化工具,以及丰富的数据集和案例研究。资源包还包括了数据清洗、统计分析、机器学习、数据挖掘等各个方面的实用教程和技巧,帮助用户快速掌握数据分析的核心技能。我们持续跟踪数据分析领域的最新发展,定期更新资源包内容,确保用户能够获取到最前沿的知识和技术。无论你是数据分析新手还是专家,这个资源包都将是你不可多得的宝贵财富。立即拥有,开启你的数据分析之旅!

    2024年家庭农场市场趋势分析.pptx

    行业报告

    2024嵌入式面试资料C&C++

    2024嵌入式面试资料C&C++提取方式是百度网盘分享地址

    .2.《【方法1】从图象看解集(下)》 (1)【课程出自拼多多店铺:北大网课资料店】

    .2.《【方法1】从图象看解集(下)》 (1)【课程出自拼多多店铺:北大网课资料店】

    基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本115.0.5772.0)

    资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom115.0.5772.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver115.0.5772.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)

    虎年春节送祝福微信小程序源码下载/新版UI/支持多种流量主

    虎年春节送祝福微信小程序源码下载,新版UI支持多种流量主,这是一款网友用以前发过的一款端午送祝福改的一款小程序。 里面的背景图包括祝福语都已经修改成与虎年相关的内容了,总体来说找的背景图还是可以的,不过有些地方和细节小编也给完善了一下。 然后小编测试的时候发现还没有流量主,所以小编也给加了几个流量主进去,到时候大家直接替换流量主的ID就可以了。 另外支持更多小程序推荐,拥有独立的推荐界面 PS:进入送祝福的按钮,部分机型是在老虎的帽子那里,部分是在金元宝那里

    大学毕业设计-javaweb-乐享校园是一个校园二手商品交易平台

    "乐享校园"这个校园二手商品交易平台是一个很好的毕业设计选题,它能够解决校园内学生之间的二手物品交易需求,促进资源的循环利用。以下是基于JavaWeb技术实现该平台的设计建议: 1. 需求分析 用户角色:确定系统的主要用户角色,如学生用户、管理员等。 核心功能: 商品发布与管理:用户可以发布商品、编辑商品信息和下架商品。 商品浏览与搜索:用户可以根据分类、关键词等搜索商品。 购物车与订单管理:用户可以将商品加入购物车,并进行订单的生成、支付和查询。 用户评价:用户可以对购买过的商品进行评价。 客服与争议解决:提供用户与卖家之间的沟通渠道,解决交易中的争议。 用户体验:界面友好,操作简便,适应不同用户的操作习惯。 安全性:确保用户数据和交易过程的安全。 2. 技术选型 前端:HTML5、CSS3、JavaScript(可选框架如Bootstrap、Vue.js等)。 后端:Java(Spring Boot)、JPA/Hibernate或MyBatis用于数据库操作。 数据库:MySQL、Oracle或PostgreSQL等。 服务器:Tomcat或Jetty。 开发工具:Eclipse

    h3cne综合实验教程.docx

    h3cne综合实验 配置和管理H3C交换机和路由器。 配置VLAN、生成树协议(STP)、链路聚合等交换机功能。 配置静态路由、动态路由协议(如RIP、OSPF)等路由器功能。 配置访问控制列表(ACL)和网络地址转换(NAT)。

    Swift语言教程&案例.zip

    Swift语言教程&案例

    MISAT医学图像分割与标注软件安装包

    2023年MISAT医学图像分割与标注软件套装推出了免费试用的标准版,经过技术团队精心研发打磨,MISAT专业版今天正式推出和大家见面了。 相比具备基础标注功能的标准版,MISAT专业版带来了更高的医学图像显示质量、更丰富的标注工具、更高效的标注数据导入流程,以及全新的自定义标签管理与标注复核功能。 MISAT团队将一如既往地深耕多模态医学图像的标注与分割,支持规范化、高质量医学图像标注数据集的构建,助力医学临床人工智能技术的应用推广。

    从0开始的RPC框架 - 简易版

    简易版RPC框架中包含RPC框架运行的核心基本组件: 消费者模块、服务提供者模块、公共模块、Web服务器、本地服务注册器、序列化器、请求处理器和基于代理模式(动态代理)。 简易版框架已经实现了远程过程调用的整体流程,扩展版会在该版本基础上进行改造开发。

    华三交换机设备的巡检命令

    参看华为交换机设备巡检命令,可以从命令显示设备目前的状态

    2024嵌入式大厂面经百度研发工程师笔试题

    2024嵌入式大厂面经百度研发工程师笔试题提取方式是百度网盘分享地址

    2024嵌入式大厂面经东华软件面试题(部分)

    2024嵌入式大厂面经东华软件面试题(部分)提取方式是百度网盘分享地址

    Tableau数据可视化实训

    Tableau数据可视化实训,清华大学出版社《大数据可视化技术与应用书籍》教材p139-145 实训

    华为OD机试C卷- 运输时间(Java & JS & Python & C).md-私信看全套OD代码及解析

    私信博主免费看所有华为OD真题、考试报告、手撕代码、面试记录

Global site tag (gtag.js) - Google Analytics