我有一个IEnumerable<T>方法,我用来在WebForms页面中找到控件.
该方法是递归的,当返回yield return递归调用的值时,我遇到一些问题,返回我想要的类型.
我的代码如下:
public static IEnumerable<Control>
GetDeepControlsByType<T>(this Control control)
{
foreach(Control c in control.Controls)
{
if (c is T)
{
yield return c;
}
if(c.Controls.Count > 0)
{
yield return c.GetDeepControlsByType<T>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这当前抛出"无法转换表达式类型"错误.但是IEnumerable<Object>,如果此方法返回类型,则代码构建,但输出中返回错误的类型.
有没有使用yield return同时也使用递归的方法?
如果我将对象传递给方法,为什么要使用ref关键字?这不是默认行为吗?
例如:
class Program
{
static void Main(string[] args)
{
TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(t);
Console.WriteLine(t.Something);
}
static public void DoSomething(TestRef t)
{
t.Something = "Bar";
}
}
public class TestRef
{
public string Something { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
输出为"Bar",表示该对象作为参考传递.
假设您有一种方法可能会陷入无休止的方法调用循环并且崩溃并发生StackOverflowException.例如,我RecursiveSelect在这个问题中提到的天真方法.
从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,默认情况下会终止相应的进程.因此,建议用户编写代码以检测并防止堆栈溢出.例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环.
把这些信息(来自这个答案)考虑在内,因为无法捕获异常,是否可以为这样的事情编写测试?或者对此进行测试,如果失败,实际上会打破整个测试套件?
注意:我知道我可以尝试一下,看看会发生什么,但我对它的一般信息更感兴趣.比如,不同的测试框架和测试运行器会以不同的方式处理吗?即使有可能,我应该避免这样的测试吗?