C# lambda func异常,可能是.Net Framework';什么虫子? 类程序 { 静态void Main(字符串[]参数) { var t=新的TestImpl(); 控制台写入线(t.Test(TestEnum.Value)); } } 公共类AbstractTest,其中T:new() { 公共虚拟测试库(TestEnum v) { 返回新的T(); } } 公共类产品 { 公共int Id{get;set;} } 公共枚举测试数 { 价值 } 公共类TestImpl:AbstractTest { 公共int测试(TestEnum ev) { Func f=()=> { var结果=基准测试基准(ev); 返回result.Id; }; 返回f(); } }
大家好: 我有一个类似代码的问题(在.net4.0上运行) 它将引发异常:试图加载格式不正确的程序。(HRESULT的异常:0x8007000B) 如果使“var result=base.TestBase(ev);”更改为“var result=this.TestBase(ev);” 这将是正常的。 如果不使用lambda func,请像这样使用公共func:C# lambda func异常,可能是.Net Framework';什么虫子? 类程序 { 静态void Main(字符串[]参数) { var t=新的TestImpl(); 控制台写入线(t.Test(TestEnum.Value)); } } 公共类AbstractTest,其中T:new() { 公共虚拟测试库(TestEnum v) { 返回新的T(); } } 公共类产品 { 公共int Id{get;set;} } 公共枚举测试数 { 价值 } 公共类TestImpl:AbstractTest { 公共int测试(TestEnum ev) { Func f=()=> { var结果=基准测试基准(ev); 返回result.Id; }; 返回f(); } },c#,lambda,C#,Lambda,大家好: 我有一个类似代码的问题(在.net4.0上运行) 它将引发异常:试图加载格式不正确的程序。(HRESULT的异常:0x8007000B) 如果使“var result=base.TestBase(ev);”更改为“var result=this.TestBase(ev);” 这将是正常的。 如果不使用lambda func,请像这样使用公共func: class Program { static void Main(string[] args) { va
class Program
{
static void Main(string[] args)
{
var t = new TestImpl();
Console.WriteLine(t.Test(TestEnum.Value));
}
}
public class AbstractTest<T> where T:new()
{
public virtual T TestBase(TestEnum v)
{
return new T();
}
}
public class Product
{
public int Id { get; set; }
}
public enum TestEnum
{
Value
}
public class TestImpl : AbstractTest<Product>
{
public int Test(TestEnum ev)
{
Func<int> f = () =>
{
var result = base.TestBase(ev);
return result.Id;
};
return f();
}
}
公共类测试mpl:AbstractTest
{
公共int测试(TestEnum ev)
{
Func f=()=>
{
//var结果=基准测试基准(ev);
//返回result.Id;
返回测试结果(ev);
};
返回f();
}
私有int测试结果(TestEnum ev)
{
var结果=基准测试基准(ev);
返回result.Id;
}
}
没关系。我认为“基本”或“这个”指向不同的情况或其他
谁能告诉我为什么,发生了什么事?理论是什么?
谢谢。您通常会遇到的错误是64位应用程序试图加载32位程序集的结果,反之亦然 然而,我实际上可以在没有安装.NET4.5的机器上重现这个问题
生成的匿名类的IL似乎真的无效,因为ILSpy甚至无法对其进行反编译。我有Visual Studio 2013 RC,我可以毫无问题地运行您的代码(除了默认值(T)将返回null,并在下一行生成null referenceexception),而不进行测试。我确认您的怀疑。由于lambda函数实际上是匿名类中的方法,lambda函数中的“base”可能被错误地解释为该不可见匿名类的“base”这是一个变量,因此会像变量一样传递给lambda。尽管我在.NET 4.0上运行LINQPad时没有问题,而且运行良好(不计算“result.Id”中的结果为空),但这是什么确切的.NET版本(4.0what?)和编译器版本?如果这在某一点上是一个bug,我也不会感到惊讶——如果是的话(没有细节,我不能肯定),它似乎在“current”中得到了修复@MiloszKrajewski:在一般情况下,这是不正确的。编译器足够聪明,不会让这种情况发生<代码>基在lambda中返回创建lambda的类的基类。@DanielHilgarth是的,但它仍然是针对另一种类型的虚拟方法的静态调用-一种非常微妙的组合,通常被CLI显式阻止。老实说,如果这在某个时候不能正常工作,我也不会感到惊讶。编译器错误发生,CLI错误发生。meh;在这种情况下,我不会排除这种可能性-需要在特定的编译器和.NET版本(特定的子版本)上进行测试,但如果这是某个版本中的错误,我并不感到惊讶-特别是,正如Milosz所指出的,这将是对另一种类型的虚拟方法的静态调用,这是需要特殊处理的东西work@MarcGravell:实际上,我只是在一台未安装.NET 4.5的机器上,通过将OP中的代码复制/粘贴到LINQPad中,重现了该错误。
public class TestImpl : AbstractTest<Product>
{
public int Test(TestEnum ev)
{
Func<int> f = () =>
{
//var result = base.TestBase(ev);
// return result.Id;
return TestResult(ev);
};
return f();
}
private int TestResult(TestEnum ev)
{
var result = base.TestBase(ev);
return result.Id;
}
}