Как насчет проверки количества кадров в стеке в операторе assert?
const int MaxFrameCount = 100000;
Debug.Assert(new StackTrace().FrameCount < MaxFrameCount);
В вашем примере из соответствующего вопроса это было бы (Дорогое утверждение assert будет удалено в сборке выпуска):
public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> subjects, Func<T, IEnumerable<T>> selector)
{
const int MaxFrameCount = 100000;
Debug.Assert(new StackTrace().FrameCount < MaxFrameCount);
// Stop if subjects are null or empty
if(subjects == null || !subjects.Any())
yield break;
// For each subject
foreach(var subject in subjects)
{
// Yield it
yield return subject;
// Then yield all its decendants
foreach (var decendant in SelectRecursive(selector(subject), selector))
yield return decendant;
}
}
Это не общий тест, поскольку вы должны ожидать, что это произойдет, плюс вы можете проверить только количество кадров, а не фактический размер стека.Также невозможно проверить, превысит ли другой вызов пространство стека, все, что вы можете сделать, это приблизительно оценить, сколько общих вызовов поместится в ваш стек.