進むべき道は、 に実際に格納されているものによって異なりますValues["id"]
。実際に である場合は、 でテストint
できます。プロパティはオブジェクトとして型付けされます。したがって、それは可能です。しかし、これは、保存された が. (以下の私の更新を参照してください。)int
Values["id"] is int
Values[]
null
int
Nullable<int>
int
(および他のすべての非参照型) をオブジェクト変数またはプロパティに割り当てると、ボックス化されます。つまり、対応する型のオブジェクトにパックされます。int
またはSystem.Int32
、値型およびボックス化された不変のSystem.Int32
参照型として存在します。その不変性により、参照型であることに気付きません。でボックス化およびボックス化解除int
できます。object obj = 5;
int i = (int)obj;
一方、ID が文字列として格納されている場合は、数値に変換する必要があります。
int id;
if (Int32.TryParse((string)Page.RouteData.Values["id"], out id)) {
// use id here
}
アップデート:
null
とには混乱があるようNullable<T>
です。
int? i; // Same as Nullable<int> or Nullable<System.Int32> or System.Int32?
object obj;
bool test;
i = null;
test = i.HasValue; // ==> false
test = i == null; // ==> true
// Now comes the strange part
obj = 5; // The int is boxed here.
// Debugger shows type of obj as "object {int}"
test = obj is int; // ==> true
test = obj is int?; // ==> true
int x = (int)obj; // ==> 5, the int is unboxed here.
// But
obj = null;
// Debugger shows type of obj as "object"
test = obj is int; // ==> false
test = obj is int?; // ==> false
test = obj == null; // ==> true
// And
i = 5;
obj = i; // i is a Nullable<int>
// Debugger shows type of obj as "object {int}"
test = obj is int; // ==> true
test = obj is int?; // ==> true
test = obj == null; // ==> false
i = null;
obj = i;
// Debugger shows type of obj as "object"
test = obj is int; // ==> false
test = obj is int?; // ==> false
test = obj == null; // ==> true
と はどちらも数値を含む場合obj is int
にobj is int?
返しますが、 !を含む場合は両方とも false を返します。Aはに割り当てられたときに に変換され、もはやではありません。true
obj
int
obj
null
null
Nullable<int>
(object)null
obj
Nullable<int>
デバッガーは、が割り当てられているかどうかに関係なく、数値が格納されている場合のobj
ように のタイプを表示します! の型はいつ格納されるかです。object {int}
int
int?
obj
object
null
したがって、Cheong Le は実際に正しいのです。