gpt4 book ai didi

c# - 为什么使用动态参数调用通用本地函数会产生 BadImageFormatException?

转载 作者:IT王子 更新时间:2023-10-29 04:51:13 25 4
gpt4 key购买 nike

尝试使用 C# 7 的局部函数,我最终得到了一些有趣的行为。考虑以下程序:

public void Main()
{
Console.WriteLine("Entered Main");
DoSomething("");
}

private void DoSomething(object obj)
{
Console.WriteLine("Entered DoSomething");
Generic((dynamic)obj);
GenericLocal(obj);
GenericLocal((dynamic)obj); // This breaks the program

void GenericLocal<T>(T val) => Console.WriteLine("GenericLocal");
}

private void Generic<T>(T val) => Console.WriteLine("Generic");

这会产生:

Entered Main

... 然后抛出 BadImageFormatException:尝试加载格式不正确的程序。 (HRESULT 异常:0x8007000B)。堆栈跟踪:

   at UserQuery.DoSomething(Object obj)
at UserQuery.Main()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

(我在 LINQPad 中运行它,但我从 dotnetfiddle 得到了类似的结果。)

删除代码中指示的行会产生您期望的输出:

Entered Main
Entered DoSomething
Generic
GenericLocal

谁能解释一下为什么?

最佳答案

turned out to be a bug ,但是当 dotnet 团队研究它时,他们意识到他们无法轻易修复问题,因此本地泛型方法将按照非本地泛型方法的方式工作。所以改为they opted使编译器在您尝试执行此操作时产生错误。

CS8322 Cannot pass argument with dynamic type to generic local function 'GenericLocal' with inferred type arguments.

关于c# - 为什么使用动态参数调用通用本地函数会产生 BadImageFormatException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45495869/

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