C# динамический оператор [дубликат]

*args и **kwargs общая идиома должна позволить произвольное число аргументов функциям, как описано в разделе больше по определению функций в документации Python.

*args даст Вам всем параметры функции как кортеж:

In [1]: def foo(*args):
   ...:     for a in args:
   ...:         print a
   ...:         
   ...:         

In [2]: foo(1)
1


In [4]: foo(1,2,3)
1
2
3

**kwargs даст Вам всем аргументы ключевого слова за исключением тех, которые соответствуют формальному параметру как словарь.

In [5]: def bar(**kwargs):
   ...:     for a in kwargs:
   ...:         print a, kwargs[a]
   ...:         
   ...:         

In [6]: bar(name='one', age=27)
age 27
name one

Обе идиомы могут быть смешаны с нормальными аргументами для разрешения фиксированного ряда и некоторые аргументы переменной:

def foo(kind, *args, **kwargs):
   pass

Другое использование *l идиома должна распаковать списки аргументов при вызывании функции.

In [9]: def foo(bar, lee):
   ...:     print bar, lee
   ...:     
   ...:     

In [10]: l = [1,2]

In [11]: foo(*l)
1 2

В Python 3 возможно использовать *l на левой стороне присвоения (Расширенная Повторяемая Распаковка), хотя это дает список вместо кортежа в этом контексте:

first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]

Также Python 3 добавляет новый семантический (отошлите PEP 3102):

def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
    pass

Такая функция принимает только 3 позиционных параметра и все после * может только быть передан как аргументы ключевого слова.

5
задан Sean Bright 30 July 2009 в 17:06
поделиться

4 ответа

You can't create dynamic operators - but you can wrap an operator in a delegate. You can use lambdas to simplify the syntax.

Func<int,int,int> opPlus = (a,b) => a + b;
Func<int,int,int> opMinus = (a,b) => a - b;
// etc..

// now you can write:
int a = 5, b = 6;
Func<int,int,int> op = opPlus;
if( op(a,b) > 9 )
    DoSomething();

Although it's not definite - the future direction for C# is to implement the compiler as a service. So, at some point, it may be possible to write code that dynamically evaluates an expression.

18
ответ дан 18 December 2019 в 07:30
поделиться

Piggybacking on LBushkin's response:

Func<int, int, bool> AGreaterThanB = (a,b) => a > b;
Func<int, int, bool> ALessThanB    = (a,b) => a < b;

Func< int, int, bool> op = AGreaterThanB;

int x = 7;
int y = 6;

if ( op( x, y ) ) 
{
    Console.WriteLine( "X is larger" );
}
else
{
    Console.WriteLine( "Y is larger" );
}

http://msdn.microsoft.com/en-us/library/bb549151.aspx

3
ответ дан 18 December 2019 в 07:30
поделиться

You might find something like Flee helpful. There are others, but their names escape me right now.

1
ответ дан 18 December 2019 в 07:30
поделиться

В C # 4.0 будет ключевое слово dynamic для динамической типизации.

-1
ответ дан 18 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: