検証を必要とせずに100%正しいと思っていることがある.
3728 ワード
Technoratiラベル:
Nullable<T> ,
汎用拘束struct ,
こうぞうインタフェースへんかん Nullable 拡張値タイプが空の値を表すことができないために拡張されたクラスです.
しかし、ILを見ると、box(空のタイプ≠参照タイプ、box)が必要であることがわかります.
MSDNは以下のように記述されている.
空のタイプを梱包する場合、共通言語実行ライブラリは、Nullableオブジェクト自体ではなくNullableオブジェクトの基礎値を自動的に梱包します.すなわち、HasValue属性がtrueであれば、Value属性のコンテンツが箱詰めされる.HasValue属性がfalseの場合、空の参照(Visual BasicではNothing)が箱詰めされます.空のタイプのベース値を箱詰め解除すると、共通言語実行ライブラリは、ベース値に初期化された新しいNullable構造を作成します.
Nullableが空きタイプになっている以上、当然boxは必要ないと思っていた.しかし、髪先をよく見るとNullableは普通のstructにすぎない.
拘束汎用struct 次のような汎用メソッドを定義し、Structで汎用パラメータを拘束します.構造からインタフェースへの変換にはboxは必要ですか?
呼び出しコード:列挙デフォルトはInt 32 列挙指定ベースクラスが表示する場合、デフォルトはInt 32であり、そのTypeコードもTypeコードである.Int32.
Nullable<T> ,
汎用拘束struct ,
こうぞうインタフェースへんかん
var i = new Nullable<int>(3);
object box = i;// , i , Value box, null box
Console.Write(box);
しかし、ILを見ると、box(空のタイプ≠参照タイプ、box)が必要であることがわかります.
L_0000: nop
L_0001: ldc.i4.3
L_0002: newobj instance void [mscorlib]System.Nullable`1<int32>::.ctor(!0)
L_0007: box [mscorlib]System.Nullable`1<int32>
L_000c: stloc.0
L_000d: ldloc.0
L_000e: call void [mscorlib]System.Console::Write(object)
L_0013: nop
MSDNは以下のように記述されている.
空のタイプを梱包する場合、共通言語実行ライブラリは、Nullableオブジェクト自体ではなくNullableオブジェクトの基礎値を自動的に梱包します.すなわち、HasValue属性がtrueであれば、Value属性のコンテンツが箱詰めされる.HasValue属性がfalseの場合、空の参照(Visual BasicではNothing)が箱詰めされます.空のタイプのベース値を箱詰め解除すると、共通言語実行ライブラリは、ベース値に初期化された新しいNullable構造を作成します.
Nullable
static void GenericVoid<T>(T i) where T : struct
{
}
Nullable<int> struct, :
GenericVoid<Nullable<int>>(i);
, : “int?” null “TSharp.Core.Test.ThreadClass.GenericVoid<T>(T)” “T”
struct “ null ”
:
public interface IPoint { int X { get; } int Y { get; } }
struct Point : IPoint
{
public int X { get; set; }
public int Y { get; set; }
}
呼び出しコード:
IPoint p = new Point();
Console.Write(p);
ILの表示:.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] class TSharp.Core.Test.ThreadClass/IPoint p,
[1] valuetype TSharp.Core.Test.ThreadClass/Point CS$0$0000)
L_0000: nop
L_0001: ldloca.s CS$0$0000
L_0003: initobj TSharp.Core.Test.ThreadClass/Point
L_0009: ldloc.1
L_000a: box TSharp.Core.Test.ThreadClass/Point
L_000f: stloc.0
L_0010: ldloc.0
L_0011: call void [mscorlib]System.Console::Write(object)
L_0016: nop
L_0017: ret
} box, struct 。
object detectorObj = MyEnum.B;
TypeCode typeCode = System.Convert.GetTypeCode(detectorObj);