Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 重写IEnumerable.NET_C#_.net - Fatal编程技术网

C# 重写IEnumerable.NET

C# 重写IEnumerable.NET,c#,.net,C#,.net,我们正在修改一些第三方代码,方法是将基类扩展为可以调整的派生类。除了一个返回IEnumerable的方法外,所有方法都运行良好 我们已经创建了一些sudo代码来测试问题的确切位置,并且可以用一个简单的示例重新创建它 在本例中,下面的代码块中的方法永远不会被调用;我们在其中放置了断点,我们添加了一个要立即抛出的异常。结果总是一样的,调试器只是跳过了这一行 有人能解释一下我们做错了什么吗?第三方代码也可能根本不起作用吗 public class Test { public virtual I

我们正在修改一些第三方代码,方法是将基类扩展为可以调整的派生类。除了一个返回IEnumerable的方法外,所有方法都运行良好

我们已经创建了一些sudo代码来测试问题的确切位置,并且可以用一个简单的示例重新创建它

在本例中,下面的代码块中的方法永远不会被调用;我们在其中放置了断点,我们添加了一个要立即抛出的异常。结果总是一样的,调试器只是跳过了这一行

有人能解释一下我们做错了什么吗?第三方代码也可能根本不起作用吗

public class Test
{
    public virtual IEnumerable GetList(Type type, string key)
    {
        throw new NotImplementedException();
    }
}

public class Test2 : Test
{
    public override IEnumerable GetList(Type type, string key)
    {
        for (var x = 0; x <= 5; x++)
        {
            yield return x;
        }
    }
}

static void Main(string[] args)
{
        var x = new Test2();
        var y = x.GetList(typeof(decimal), "test") as List<int>;
}
编辑:很多好的答案,简而言之,问题是收益率关键字。由于这是第三方实现,我只能在虚拟方法中更改代码。最后,我从它返回了一个IEnumerable,而不是从循环返回


这使得代码能够在第三方库中工作。

这是因为您正在强制执行列表

尝试:

请注意,GetList现在返回的是IEnumerable,而不是IEnumerable,因为IEnumerable具有ToList。

此表达式:

x.GetList(typeof(decimal), "test") as List<int>;
这不是因为铸造,而是因为成品率意味着一个迭代,没有人强迫任何类型的迭代,所以什么都不会发生。为了证明这一点,只需在不强制转换的情况下重写相同的代码,如下所示

变量y=x.GetListtypeofdecimal,测试

同样的错误结果,就像以前一样。 要正确地使用函数,正如它实现时一样,您需要在内部调用 循环,例如:

x.GetListtypeofdecimal中的foreachvar i,test{}

,或使用其他方法,如强制集合枚举的ToList


现在您的方法实际上将被调用

因为它是一个迭代器方法,所以在枚举开始之前(例如使用foreach)不会实际输入方法中的代码。。。yield return导致在枚举集合之前不会对代码求值。tolist调用这不完全正确。例如,如果他的原始Test2.GetList返回“returnnewlist;”如果不使用yield,那么casting将导致调用该方法,并且与var y=x.GetListtypeofdecimal,test不同@Letseatlunch:我的观点是,问题不是因为强制转换本身,而是因为缺少枚举调用。我们可以通过不同的方式实现这一点。你是对的,问题不是因为强制转换本身,而是因为它被强制转换为List并返回null,所以它永远不能被枚举。正如你所展示的,如果他不做演员,他可以按原样使用他的方法。
public class Test
{
    public virtual IEnumerable<int> GetList(Type type, string key)
    {
       throw new NotImplementedException();
    }
}

public class Test2 : Test
{
    public override IEnumerable<int> GetList(Type type, string key)
    {
       for (var x = 0; x <= 5; x++)
       {
           yield return x;
       }
    }
}
static void Main(string[] args)
{
    var x = new Test2();
    var y = x.GetList(typeof(decimal), "test").ToList();
}
x.GetList(typeof(decimal), "test") as List<int>;
var listofints = x.GetList(typeof(decimal), "test").Cast<int>().ToList();