Здравствуйте, кывтчане!
Помогите, пожалуйтса, собрать все случаи проявления боксинга в C#, а то я уже опух искать опкод box в msil-коде framework'а
Из спеки C# такие вытекают такие случаи:
Приведения типа-значения к System.Object:
struct S { }
object box = new S();
Приведения типа-значения к System.ValueType:
struct S { }
System.ValueType box = new S();
Приведения типа-перечисления к System.Enum:
enum E { A }
System.Enum box = E.A;
Приведения типа-значения к типу интерфейса:
interface I { }
struct S : I { }
I box = new S();
Создание делегата из метода уровня экземпляра типа-значения:
struct S { public void M() {} }
System.Action box = new S().M;
Более интересные случаи:
В конкатенации строк с типами-значениями:
char c = F();
string s1 = "char value will box" + c;
Вызовы
не_переопределённых виртуальных методов, "унаследованных" от System.Object:
enum E { A }
E.A.GetHashCode();
Вызовы base-реализаций виртуальных методов, унаследованных от System.Object в методах типа-значения:
struct S {
public override string ToString() {
return base.ToString();
}
}
Вызов не виртуального метода Object.GetType() на типе-значении (спасибо _FRED_'у):
struct S { }
new S().GetType();
Ещё был случай со IDisposable-структурами в using statement, но его починили и спеку даже поправили

Меня в первую очередь интересуют именно конструкции языка C#, которые ещё могут порождать боксинг в неожиданных местах.
Заранее спасибо.