问题标签 [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.

0 投票
4 回答
3011 浏览

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' 试图隐式实现具有较弱类型参数约束的接口方法。”

但是这个错误在技术上不是错误的吗?不使用ObjectforC<T1>否定对 的约束C.Foo(),从而使其等效于 - NOT 强于 - I.Foo()?编译器似乎同意,但运行时不同意。

为了证明我的观点,我通过去掉D等式来简化它:

但:

这对于传递给Foo<T>().

为什么?运行时是否存在错误,或者(更有可能)我没有看到导致此异常的原因 - 在这种情况下,编译器不应该阻止我吗?

有趣的是,如果通过将约束从类移动到接口来反转场景......

我再次否定了约束:

这次运行正常!

任何事情都会发生,这对我来说很有意义。D(在等式中有或没有相同)

那么为什么第一种方式会中断?

附录:

我忘了补充一点,TypeLoadException 有一个简单的解决方法:

明确实施I.Foo()是好的。只有隐式实现会导致 TypeLoadException。现在我可以这样做了:

但这仍然是一个特例。尝试使用 System.Object 以外的任何其他内容,这将无法编译。我觉得这样做有点脏,因为我不确定它是否故意这样工作。

0 投票
2 回答
967 浏览

c# - 这是动态中的错误吗?

当在泛型类上实现动态调度dynamic,并且泛型类型参数是另一个类的私有内部类时,运行时绑定器会抛出异常。

例如:

在这里,RuntimeBinderException将与消息一起抛出

'Dispatcher.CallDispatch(int)' 由于其保护级别而无法访问

无法访问的原因是类型参数是无法访问T的私有参数。因此,必须是不可访问的 - 但它不是,因为它可以作为.CallTypeDispatcher<T>CallDispatchT

这是一个错误dynamic,还是不应该支持?

0 投票
2 回答
6061 浏览

c++ - 命名空间内的运算符 new

给出错误信息:

它是gcc 编译器错误吗?在较旧的 gcc 版本中,它似乎正在工作。任何想法,为什么不允许?

用例:我想只允许自定义operator new/delete类并且想禁止全局new/operator。不是链接器错误,而是很容易捕获编译器错误;所以我编码:

这适用于旧版本的 gcc,但不适用于新版本。

0 投票
2 回答
921 浏览

c# - C#编译器错误?用于表达式中只写属性的对象初始化器语法使 csc 崩溃

您可能会认为这是一个错误报告,但是我很好奇我在这里是否大错特错,或者是否有来自 Eric 或 Microsoft 其他人的解释。

更新

这现在作为一个错误发布在 Microsoft Connect 上。

描述

考虑以下类:

在这里,A.B是一个只写但其他很好的属性。
现在,假设我们在 expression 内部分配它

此代码使 C# 编译器(3.5 .30729.4926 和4.0 .30319.1)吐出

内部编译器错误(地址 013E213F 处的 0xc0000005):可能的罪魁祸首是“BIND”。

和崩溃。

但是,仅用构造函数 ( )替换对象初始值设定项语法 ( )就可以很好地编译{ }( )

复制的完整代码:

(是的,我确实在一个真正的项目上成功了。)

0 投票
8 回答
588 浏览

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代码片段中的使用,因为这不是我想要问的。

0 投票
3 回答
312 浏览

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) 中的次要定义。

我的意思是我没有做一些牵强附会的事情。两个编译单元可以为本地类使用相同的名称是很合理的,尤其是。在一个大项目中。

这是一个错误吗?有人可以对这个问题有所了解吗?

0 投票
4 回答
1464 浏览

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++(如果是,为什么不)——编译它的解决方法很好,但不是这个问题的一部分。

0 投票
2 回答
227 浏览

c++ - 这是 Visual Studio 2010 中的编译器错误吗?

我在这个条件中有一个错误:

在发布模式下,它似乎陷入了无限循环。在调试模式下工作正常,或者当我在最后一行放置调试打印时更有趣

这是为条件本身生成的程序集:

您可以看到,对于第二个条件,它似乎将 'dontRotate' 的值(一个 bool 类型的函数参数)移动到 eax 中,然后与它进行比较,但 dontRotate 的使用远不及那段代码。

我知道这可能是一点点数据,但个人认为这是一个明显的编译器错误。但可悲的是,我不确定如何将其提炼成一个足够独立的问题来实际生成错误报告。

编辑:不是实际的减速,而是类型:

编辑2:

一旦我将调试打印语句添加到 while 的末尾,这就是生成的程序集,它不再表示错误:

0 投票
4 回答
441 浏览

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

编辑

请注意,我对解决方法不感兴趣。我想知道上面的代码是否应该编译。

0 投票
1 回答
139 浏览

parsing - 这是一个 F# 2.0 解析器错误吗?

Microsoft (R) F# 2.0 交互式版本 4.0.40219.1

我正在尝试定义新的记录类型:

一切都很好,但让我们再添加一个字段:

我在上面标记的位置收到解析器错误:

我的代码有什么问题?是编译器错误吗?