当前位置: 首页 > 编程语言 > C#

C#语言设计:`is`运算符内的方法组分享

时间:2023-04-10 23:49:21 C#

C#语言设计:`is`运算符内的方法组我对C#语言的一些设计选择很感兴趣。C#规范中有一条规则允许使用方法组作为运算符的表达式:classFoo{staticvoidMain(){if(MainisFoo)Main();}}上面的条件总是假的,因为规范说:7.10.10是运算符?如果E是方法组或空文字,如果E的类型是引用类型或可空类型,则结果为假E的值为空。我的问题:在CLR中允许没有运行时表示的C#语言元素的目的/要点/原因是什么,例如此类“运行时”运算符中的方法组?允许C#语言元素在CLR中没有运行时表示的目的/要点/原因是什么,例如此类“运行时”运算符中的方法组?语言设计规范档案没有提到为什么做出这个决定,所以对答案的任何猜测都是推测。他们确实提到,如果可以静态地确定“是”的结果始终为真或假,那么它就会如此确定并产生警告。这似乎有点可能只是一个错误。将可能正确的错误变成警告(或简单地允许它)的最常见原因是因为这减轻了自动生成代码的程序生成器的负担。但是,我在这里看不到真正令人信服的案例。更新:我刚刚检查了C#1.0规范。它没有这样的语言。它没有提到null或方法组参数。当然,它并没有提到方法组转换,因为在C#1.0中没有隐式方法组转换;如果要将方法M转换为委托类型D,则必须显式调用“newD(M)”。后一点是“MisD”返回false而不是true的原因;你不能合法地说“Dd=M;”那么为什么“MisD”是真的呢?当然这在C#2.0中没有多大意义,因为你可以只说“Dd=M;”在C#2.0中。我还问了一个在设计“是”运算符时出现的人,但不知何故他无法决定这一点。他怀疑“is”运算符的原始设计是不给出任何错误,只是警告,规范中关于如何处理方法组和空值以及事后添加的内容的所有文本都是针对C#的规范的2.0版本,并基于编译器实际执行的操作。简而言之,这看起来像是C#1.0中的一个设计漏洞,在为C#2.0更新规范时被涂上了。看起来这种特殊行为并不是有意有意地实施的。匿名方法在C#2.0中用作“is”的参数时确实会产生错误,这一事实进一步加强了这一理论。这样做不会是一个破坏性的变化,但如果“MisD”突然开始返回true或者是一个错误,那就是。进一步更新:我在研究这个的时候学到了一些有趣的东西。(对我来说。)最初设计特征时,设计是允许类型名称或Type对象作为“是”的右侧参数。这个想法在C#1.0发布之前就被放弃了。首先,方法不是类型,msdn明确说明如下:is运算符用于检查对象的运行时类型是否与给定类型兼容示例publicstaticvoidTest(objecto){Class1a;if(oisClass1){}}来自MSDN:如果以下两个条件都为真,则表达式的计算结果为真:因此,您的示例在第二点上错误的原因必须可以转换为特定类型。我希望我没有错过对问题的理解。以上就是C#学习教程分享的全部内容:C#语言设计:`is`运算符中的方法组。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: