2

私はobjectゼロより大きい数を保持する(許可された)を持っています。42 としましょう。元々はHttpContext.Sessionコレクションの一部です。

Session["myNumber"] = 42;
object obj = Session["myNumber"];

キャストでintとして使用してみました:

int num = (int)obj;

これは を返します0

しかし、私はやりたいことを何とか手に入れました:

int num = int.Parse(obj.ToString());

これは私に与えます42

これは理にかなっていますか、宣言や型などに問題があるのでしょうか?

4

4 に答える 4

5

以下で私がしようとしている重要なポイントは、実際にはそうではないが、アンボックスが機能するのに十分に似ている場合は可能かもしれないということです. それを理解するという点で、私がここで主に注目するのは、 とは何かということです。objintintobj.GetType()

OK、邪悪なコード: - 最初に重要なビット:

static void Main()
{
    object obj = Evil();
    int i = (int)obj; // 0
    int j = int.Parse(obj.ToString()); // 42
}

どうやってこの怪物を作ったのですか?

私は嘘をついてだましました...基本的に、私はこれをしました:

enum bar {
    @42 = 0 // not legal C#... "42" is not a valid identifier
}

しかし、CLI レベルでは有効です...

static object Evil()
{
    var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
        new AssemblyName("foo"), AssemblyBuilderAccess.Run);
    var mb = ab.DefineDynamicModule("foo");
    var eb = mb.DefineEnum("bar", TypeAttributes.Public, typeof(int));
    eb.DefineLiteral("42", 0);
    Type t = eb.CreateType();
    return Enum.ToObject(t, 0);
}
于 2012-10-18T09:07:53.153 に答える
3

あなたが説明することは、単に起こりません。

オブジェクトのボックス化解除時に値を取得した場合0、オブジェクトには実際には boxed が含まれてintおり、実際には値が含まれています0

値をボックス化解除する唯一の方法は、値の正確な型を使用することです。つまり、int.

コードにこれを引き起こす何か他のものがなければなりません。

于 2012-10-18T09:09:57.330 に答える
1

コードを実行すると

        object obj = 42;

        int num = (int)obj; 

        int num2 = int.Parse(obj.ToString()); 

どちらの場合も42を返します。

したがって、objはオブジェクト以外のものでなければなりません(あなたが述べたように)。したがって、これにさらに答えるには、宣言されたタイプogobjが必要になります。

于 2012-10-18T09:03:38.097 に答える
1

はい、「42」はさまざまな方法で表すことができるので、それは理にかなっています。文字列ですか?整数ですか?16進文字列ですか?バナナとオレンジですか(冗談ではありません)?

したがって、C# に "int.Parse" と尋ねると、C# に「これは整数に標準の C# 文字列表記を使用した整数です。

「(int)obj」という行で C# を説明したとき、このことはすでに整数であると言っていました。

それが役立つことを願っています。

于 2012-10-18T09:01:43.807 に答える