gpt4 book ai didi

c# - 使用 ? 时出现编译器错误。导致无法通过 PEVerify 的不良图像

转载 作者:可可西里 更新时间:2023-11-01 03:11:12 26 4
gpt4 key购买 nike

我偶然发现了一些奇怪的事情:我得到了一个 BadImageFormatException,但不知道它可能指的是什么图像(程序集)。

我缩减了解决方案,使其只包含一个没有依赖项的项目:

enter image description here

如您所见,它仅使用System(和mscorlib),当然我不会在运行时加载程序集。

它使用 .NET 4.5.2 编译为 AnyCpu,使用 C#6 编译为 VS 2015,尽管这些都不重要。

我尝试用 C#5 制作一个示例,但是一旦我替换了所有“?”。运营商,它停止发生。

我主持了这个项目,以便人们可以自己尝试:

git clone -b crash-sample https://github.com/jtheisen/moldinium.git

我在 4 台机器上清理并测试了它,都显示出相同的效果。

崩溃的堆栈跟踪是:

Ex.: System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2(ListEvent`1 v)
at IronStone.Moldinium.ActionObserver`1.OnNext(T value) in C:\Source\Repos\moldinium\ConsoleApplication1\Rx.cs:line 51
...snipped...

在输出上运行 PEVerify 会产生以下错误:

[IL]: Error: [C:\Source\Repos\moldinium\ConsoleApplication1\bin\Debug\Bad.exe : IronStone.Moldinium.LiveList+<>c__DisplayClass10_0`1[TSource]::b__2][offset 0x0000013B] Unable to resolve token.

从 Select.cs 文件中删除所有 ?. 运算符可解决问题。

使用 ILSpy 我已将问题隔离到:

IronStone.Moldinium.LiveList.<>c__DisplayClass10_0`1.<Where>b__2

您可以在要点中查看方法的 IL 转储(通过 ILSpy)here . Bad IL 是在使用 ? 时。 Good IL 是 C# 5.0 风格。

这是用 VS2015.3 构建的

CSC Version: Microsoft (R) Visual C# Compiler version 1.3.1.60616

最佳答案

我帮不了你,因为它确实是一个错误。但我可以将您带到错误发生的地方,它可能会帮助您在几行代码中重现错误。

namespace ElvisBugInNullableGenericStructWithNestedTypeParameter
{
struct MyGenericStruct<T> { }
class Program
{
static void Main() { }

void Test<T>()
{
Func<T, bool> func = (arg =>
{
MyGenericStruct<T>? v1 = null;
return v1?.ToString() == null;
});
}
}
}

如果我将替换MyGenericStruct<T>?MyGenericStruct<int>?它会起作用。

问题是,出于某种原因,当我们使用外部 T 时在可为空的结构中,然后我们尝试使用 Elvis 运算符 ?类型未知(无法解析 token )。

更新如果你想解决你的问题,你不需要删除所有的 Elvis 运算符,只需将它们从 Subscribe 中删除即可。 public static ILiveList<TSource> Where<TSource>(this ILiveList<TSource> source, Func<TSource, Boolean> predicate) 内的操作方法。

关于c# - 使用 ? 时出现编译器错误。导致无法通过 PEVerify 的不良图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38316552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com