この単純なコンソールアプリケーションを試し、示された行にブレークポイントを置き、デバッガを実行し、最初のブレークポイントで(F11)を押します。それは2番目のブレークポイントを欠場するはずです。それ以外の場合は、ビジュアルスタジオの設定/拡張機能が混乱するかもしれません。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace tmp {
class Program {
static void Main(string[] args) {
IEnumerable<Type> types = typeof(System.IO.IOException).GetHierarchy(typeof(System.Exception)); //break point here
int i = 0;
}
}
static class Ext {
//[DebuggerStepThrough]
//[DebuggerNonUserCode]
//[DebuggerStepperBoundary]
public static IEnumerable<Type> GetHierarchy(this Type type, Type limit) {
if (type == null) { //break point here
throw new Exception();
}
do {
yield return type;
if (type == limit) {
yield break;
}
} while ((type = type.BaseType) != null);
}
[DebuggerStepThrough]
public static IEnumerable<Type> GetHierarchy2(this Type type, Type limit) {
if (type == null) { //break point here
throw new Exception();
}
IList<Type> types = new List<Type>();
do {
types.Add(type);
if (type == limit) {
break;
}
} while ((type = type.BaseType) != null);
return types;
}
}
}
EDITは、実際に私はそれがyield文とは何かを持っていると思います。リスト(GetHierarchy2)をビルドしようとすると、DebuggerStepThrough属性に問題はありません
それは確かにそのように見えます。私はこれに気づいていないと率直に驚いています。 IEnumerable/IEnumeratorクラスを明示的に実装するだけですが、少し面倒ですが、全体的に価値があるかもしれません。 –