0

パラメータが次のようなメソッドが欲しいのですInt32Single

void myMethod( ref object x )
{
     //...CodeHere
}

outC#では、またはを使用するときにオブジェクトの特殊化を渡すことができないため、私がref見つけた解決策では、変数をその型の変数に割り当てるobjectだけで十分であると主張しました。

Single s = 1.0F;
object o = s;
myMethod( ref o );

それはうまくいきませんでした。私が見たMicrosoftのドキュメントによると、はへoのポインタであるはずsです。私が調べたソースでは、非プリミティブ型を割り当てると、newインスタンスではなく参照が生成されると記載されています。

私が渡すことができるメソッド、SingleまたはInt32その他の特殊なタイプを使用することは可能objectですか?

4

5 に答える 5

9

メソッドをオーバーロードします。

void myMethod( ref int x )
{
    //...
}

void myMethod(ref single x)
{
    //...
}
于 2009-09-14T13:59:06.920 に答える
1

残念ながら、あなたは運が悪いです。次の2つの方法を使用することをお勧めします。

void MyMethod(ref float x)
{
  //....
}

void MyMethod(ref int x)
{
  //....
}
于 2009-09-14T13:59:10.273 に答える
1

「パラメータがInt32またはSingleになるメソッドが欲しい」

代わりにジェネリックメソッドを使用するのはどうですか?

注意:現在のバージョンのC#では、int、floatなどの特定の型ではなく、許可される型を構造化するように制限することしかできません。

于 2009-09-14T14:00:09.027 に答える
0

オブジェクトの値をボックス化する代わりに、関数をオーバーロードできます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
        }

        static int test = 0;

        static void MyMethod(int arg)
        {
            test += arg;
        }

        static void MyMethod(ref int arg)
        {
            test += arg;
        }

        static void MyMethod(Single arg)
        {
            test += Convert.ToInt32(arg);
        }

        static void MyMethod(ref Single arg)
        {
            test += Convert.ToInt32(arg);
        }
    }
}

もちろん、メソッド内の引数で何をするかは、何を達成しようとしているかによって異なります。

于 2009-09-14T14:03:48.597 に答える
0

私はおそらくAshのアプローチを使用し、次の行に沿って一般的な実装を使用します。

    static void myMethod<T>(ref T value) where T : struct, IConvertible, IComparable<T>, IEquatable<T>
    {
        value = (T)Convert.ChangeType(value.ToSingle(CultureInfo.CurrentCulture) * 2.0, typeof(T));
    }

    static void Main(string[] args)
    {
        int data1 = 5;

        myMethod(ref data1);
        if (data1 != 10)
            throw new InvalidOperationException();

        Single data2 = 1.5f;

        myMethod(ref data2);
        if (data2 != 3)
            throw new InvalidOperationException();
    }
于 2009-09-14T15:43:34.773 に答える