0

C#でパラメータの動的数を持つメソッドを作成することは可能ですか?

例えば

Public void sum(dynamic arguments//like JavaScript)
{
   //loop at run-time  on arguments and sum
}

動的オブジェクトを使用できますか?

4

3 に答える 3

3

paramsキーワードを使用して、可変数の引数を実現します。

params キーワードを使用すると、可変数の引数を取るメソッド パラメーターを指定できます。パラメーター宣言で指定された型の引数のコンマ区切りリスト、または指定された型の引数の配列を送信できます。引数を送信しないこともできます。

例えば:public void Sum( params int[] args ){ }

動的オブジェクトを使用できますか?

はい、しかしおそらくあなたが考えている方法ではありません。

// example 1 - single parameter of type dynamic
private static void Sum( dynamic args ) { }

// will not compile; Sum() expects a single parameter whose type is not
// known until runtime
Sum( 1, 2, 3, 4, 5 );

// example 2 - variable number of dynamically typed arguments
private static void Sum( params dynamic[] args ) { }

// will compile
Sum( 1, 2, 3, 4, 5 );

したがって、次のようなメソッドを使用できます。

public static dynamic Sum( params dynamic[] args ) {

    dynamic sum = 0;

    foreach( var arg in args ){
        sum += arg;
    }

    return sum;
}

それを次のように呼び出しますSum( 1, 2, 3, 4.5, 5 )。DLR は、引数から正しい型を推測するのに十分スマートであり、戻り値は になりますSystem.Doubleただし(少なくともSum()メソッドの場合)、型指定の明示的な制御を放棄し、型の安全性を失うことは悪い考えのように思えます。

Enumerable.Sum()を使用しない理由があると仮定しています

于 2013-03-03T18:35:43.793 に答える
1

単体テストの例は、物事を少し明確にするかもしれません:

    [Test]
    public void SumDynamics()
    {
        // note that we can specify as many ints as we like
        Assert.AreEqual(8, Sum(3, 5)); // test passes
        Assert.AreEqual(4, Sum(1, 1 , 1, 1)); // test passes
        Assert.AreEqual(3, Sum(3)); // test passes
    }

    // Meaningless example but it's purpose is only to show that you can use dynamic 
    // as a parameter, and that you also can combine it with the params type.
    public static dynamic Sum(params dynamic[] ints)
    {
        return ints.Sum(i => i);
    }

ダイナミクスを使用するときは、コンパイラにバックオフするように指示しているため、実行時に例外が発生することに注意してください。

    [Test, ExpectedException(typeof(RuntimeBinderException))]
    public void AssignDynamicIntAndStoreAsString()
    {
        dynamic i = 5;
        string astring = i; // this will compile, but will throw a runtime exception
    }

ダイナミクスの詳細をお読みください。

パラメータの詳細を読む

于 2013-03-03T19:00:18.980 に答える
1

はい、ここで見ることができます

http://msdn.microsoft.com/library/w5zay9db(v=vs.80).aspx

(paramsキーワード)

于 2013-03-03T18:35:03.513 に答える