私はボクシングが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();
C#文字列連結での値型の使用:
char c = F(); string s1 = "char value will box" + c;
注:
char
型の定数はコンパイル時に連結されます注:バージョン6.0 C#コンパイラ以降に最適化し連結関与
bool
、char
、IntPtr
、UIntPtr
種類値型インスタンスメソッドからデリゲートを作成する:
struct S { public void M() {} } Action box = new S().M;
値型でオーバーライドされていない仮想メソッドを呼び出す:
enum E { A } E.A.GetHashCode();
is
式の下でC#7.0定数パターンを使用する:int x = …; if (x is 42) { … } // boxes both 'x' and '42'!
C#タプルタイプ変換でのボクシング:
(int, byte) _tuple; public (object, object) M() { return _tuple; // 2x boxing }
object
値型のデフォルト値を持つ型のオプションのパラメーター:void M([Optional, DefaultParameterValue(42)] object o); M(); // boxing at call-site
制約のないジェネリック型の値をチェックしています
null
:bool M<T>(T t) => t != null; string M<T>(T t) => t?.ToString(); // ?. checks for null M(42);
注:これは、一部の.NETランタイムでJITによって最適化される場合があります
/演算子を使用した制約なしまたは
struct
ジェネリック型の型テスト値:is
as
bool M<T>(T t) => t is int; int? M<T>(T t) => t as int?; IEquatable<T> M<T>(T t) => t as IEquatable<T>; M(42);
注:これは、一部の.NETランタイムでJITによって最適化される場合があります
あなたが知っている、おそらく隠されたボクシングの状況は他にありますか?