在使用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");
这会产生以下结果:
已输入Main
..。然后抛出一个BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from 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得到了类似的结果。)
删除代码中指定的行将产生预期的输出:
已输入Main
输入的DoSomething
通用
GenericLocal
有谁能解释一下原因吗?
发布于 2020-08-08 01:37:05
这个turned out to be a bug,但当dotnet团队研究它时,他们意识到他们不能轻易地修复问题,所以本地泛型方法的工作方式与非本地泛型方法的工作方式相同。所以取而代之的是they opted,让编译器在你尝试这样做的时候产生一个错误。
CS8322无法将具有动态类型的参数传递给具有推断类型参数的泛型局部函数“”GenericLocal“”。
发布于 2017-09-14 21:11:30
当您稍微帮助编译器时,代码将不会崩溃:
GenericLocal<dynamic>((dynamic)obj); // This doesn't break the program
https://stackoverflow.com/questions/45495869
复制相似问题