问题标签 [compiler-bug]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 为什么这个泛型场景会导致 TypeLoadException?
这有点冗长,所以这里是快速版本:
为什么这会导致运行时 TypeLoadException?(编译器应该阻止我这样做吗?)
如果您尝试实例化 D,则会发生异常。
更长,更具探索性的版本:
考虑:
这是非法的,因为 上的类型约束与 上的C.Foo()
不匹配I.Foo()
。它会生成编译器错误 CS0425。
但我想我也许可以打破规则:
通过Object
用作 T2 上的约束,我否定了该约束。我可以安全地将任何类型传递给D.Foo<T>()
,因为一切都源自Object
.
即便如此,我仍然希望得到一个编译器错误。在 C#语言的意义上,它违反了“C.Foo() 上的约束必须与 I.Foo() 上的约束相匹配”的规则,我认为编译器会严格遵守这些规则。但它确实编译。似乎编译器看到了我在做什么,理解它是安全的,并且视而不见。
我以为我已经侥幸逃脱了,但运行时说没那么快。如果我尝试创建 的实例D
,则会收到 TypeLoadException:“类型 'D' 上的方法 'C`1.Foo' 试图隐式实现具有较弱类型参数约束的接口方法。”
但是这个错误在技术上不是错误的吗?不使用Object
forC<T1>
否定对 的约束C.Foo()
,从而使其等效于 - NOT 强于 - I.Foo()
?编译器似乎同意,但运行时不同意。
为了证明我的观点,我通过去掉D
等式来简化它:
但:
这对于传递给Foo<T>()
.
为什么?运行时是否存在错误,或者(更有可能)我没有看到导致此异常的原因 - 在这种情况下,编译器不应该阻止我吗?
有趣的是,如果通过将约束从类移动到接口来反转场景......
我再次否定了约束:
这次运行正常!
任何事情都会发生,这对我来说很有意义。D
(在等式中有或没有相同)
那么为什么第一种方式会中断?
附录:
我忘了补充一点,TypeLoadException 有一个简单的解决方法:
明确实施I.Foo()
是好的。只有隐式实现会导致 TypeLoadException。现在我可以这样做了:
但这仍然是一个特例。尝试使用 System.Object 以外的任何其他内容,这将无法编译。我觉得这样做有点脏,因为我不确定它是否故意这样工作。
c# - 这是动态中的错误吗?
当在泛型类上实现动态调度dynamic
,并且泛型类型参数是另一个类的私有内部类时,运行时绑定器会抛出异常。
例如:
在这里,RuntimeBinderException
将与消息一起抛出
'Dispatcher.CallDispatch(int)' 由于其保护级别而无法访问
无法访问的原因是类型参数是无法访问T
的私有参数。因此,必须是不可访问的 - 但它不是,因为它可以作为.CallType
Dispatcher<T>
CallDispatch
T
这是一个错误dynamic
,还是不应该支持?
c++ - 命名空间内的运算符 new
给出错误信息:
它是gcc 编译器错误吗?在较旧的 gcc 版本中,它似乎正在工作。任何想法,为什么不允许?
用例:我想只允许自定义operator new/delete
类并且想禁止全局new/operator
。不是链接器错误,而是很容易捕获编译器错误;所以我编码:
这适用于旧版本的 gcc,但不适用于新版本。
c# - C#编译器错误?用于表达式中只写属性的对象初始化器语法使 csc 崩溃
您可能会认为这是一个错误报告,但是我很好奇我在这里是否大错特错,或者是否有来自 Eric 或 Microsoft 其他人的解释。
更新
这现在作为一个错误发布在 Microsoft Connect 上。
描述
考虑以下类:
在这里,A.B
是一个只写但其他很好的属性。
现在,假设我们在 expression 内部分配它:
此代码使 C# 编译器(3.5 .30729.4926 和4.0 .30319.1)吐出
内部编译器错误(地址 013E213F 处的 0xc0000005):可能的罪魁祸首是“BIND”。
和崩溃。
但是,仅用构造函数 ( )替换对象初始值设定项语法 ( )就可以很好地编译{ }
( )
。
复制的完整代码:
(是的,我确实在一个真正的项目上成功了。)
c# - C# 编译器无法识别出类似的收益返回方法?
如果我有两个yield return
具有相同签名的方法,编译器似乎不会识别它们是相似的。
我有两种yield return
这样的方法:
有了这个,我希望下面的语句编译得很好:
Func<int, IEnumerable<int>> generator = 1 == 0 ? EvenNumbers : OddNumbers; // Does not compile
我收到错误消息
无法确定条件表达式的类型,因为“方法组”和“方法组”之间没有隐式转换
但是,显式转换有效:
Func<int, IEnumerable<int>> newGen = 1 == 0 ? (Func<int, IEnumerable<int>>)EvenNumbers : (Func<int, IEnumerable<int>>)OddNumbers; // Works fine
我是否遗漏了什么或者这是 C# 编译器中的错误(我使用的是 VS2010SP1)?
注意:我已经阅读了这个并且仍然相信第一个应该编译得很好。
编辑:删除了var
代码片段中的使用,因为这不是我想要问的。
c++ - 愉快地链接不兼容的类型会导致混乱
我一直在试图找出一些边界g++
,尤其是链接(C++)目标文件。我发现了以下好奇心,在询问之前我试图尽可能地压缩它。
代码
文件common.h
a.cpp
编译的文件g++ -Wall -c a.cpp
b.cpp
编译的文件g++ -Wall -c b.cpp
main.cpp
编译并链接的文件g++ -Wall a.o b.o main.cpp
结果./a.out
是
问题
现在,我本以为我会g++
因为试图联系在一起而给我起一些讨厌的a.o
名字b.o
。尤其是分配za.y = zb.y
是邪恶的。这不仅g++
完全没有抱怨,而且我希望它将具有相同名称 ( Y
) 的不兼容类型链接在一起,而且它完全忽略了b.o
(resp. b.cpp
) 中的次要定义。
我的意思是我没有做一些牵强附会的事情。两个编译单元可以为本地类使用相同的名称是很合理的,尤其是。在一个大项目中。
这是一个错误吗?有人可以对这个问题有所了解吗?
c++ - 在命名空间中转发定义类?
以下代码段无法使用 Visual Studio 2010 编译,但 GCC 喜欢它:
我在这里做一些愚蠢的事情还是这是一个有效的编译器错误?我得到的错误是:
error C2888: 'void Bar::Foo(void)' : symbol cannot be defined within namespace 'Test'
它使用 GCC 4.5.1 编译:http: //ideone.com/7sImY
[编辑]为了清楚起见,我想知道这是否是有效的 C++(如果是,为什么不)——编译它的解决方法很好,但不是这个问题的一部分。
c++ - 这是 Visual Studio 2010 中的编译器错误吗?
我在这个条件中有一个错误:
在发布模式下,它似乎陷入了无限循环。在调试模式下工作正常,或者当我在最后一行放置调试打印时更有趣
这是为条件本身生成的程序集:
您可以看到,对于第二个条件,它似乎将 'dontRotate' 的值(一个 bool 类型的函数参数)移动到 eax 中,然后与它进行比较,但 dontRotate 的使用远不及那段代码。
我知道这可能是一点点数据,但个人认为这是一个明显的编译器错误。但可悲的是,我不确定如何将其提炼成一个足够独立的问题来实际生成错误报告。
编辑:不是实际的减速,而是类型:
编辑2:
一旦我将调试打印语句添加到 while 的末尾,这就是生成的程序集,它不再表示错误:
c++ - 使用 VS2010 SP1 的函数模板中的编译器错误
为什么我得到标记的编译器错误(C2899)?我尝试使用 VS2010 SP1。
亲切的问候
西蒙
PS:我知道我可以使用std::copy(..)
with std::back_inserter(..)
- 但这不是重点。
编辑
perreal 在评论中回答了这个问题: http ://connect.microsoft.com/VisualStudio/feedback/details/694857/bug-in-lambda-expressions
编辑
请注意,我对解决方法不感兴趣。我想知道上面的代码是否应该编译。
parsing - 这是一个 F# 2.0 解析器错误吗?
Microsoft (R) F# 2.0 交互式版本 4.0.40219.1
我正在尝试定义新的记录类型:
一切都很好,但让我们再添加一个字段:
我在上面标记的位置收到解析器错误:
我的代码有什么问题?是编译器错误吗?