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