Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 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

大家好:

我有一个类似代码的问题(在.net4.0上运行)

它将引发异常:试图加载格式不正确的程序。(HRESULT的异常:0x8007000B)

如果使“var result=base.TestBase(ev);”更改为“var result=this.TestBase(ev);” 这将是正常的。 如果不使用lambda func,请像这样使用公共func:

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;
    }
}