Явно используйте дополнительный метод

Python (71 + 467, включая пробелы)

import sys
sys.path += ["TDOC.zip"]
import TDOC
TDOC.print_verse()

Где TDOC.zip (467 байт) содержит TDOC.py:

def print_verse(presents="""\
twelve drummers drumming,
eleven pipers piping,
ten lords a-leaping,
nine ladies dancing,
eigth maids a-milking,
seven swans a-swimming,
six geese a-laying,
five gold rings,
four calling birds,
three french hens,
two turtle doves, and
a partridge in a pear tree.""".split("\n")):
    if presents: 
        print_verse(presents[1:])

        number = presents[0].split(" ", 1)[0]
        print("On the %s day of Christmas my true love gave to me %s" % (
            dict(a="first", two="second", three="third", five="fifth").get(number, number+"th"),
            " ".join(presents)))
11
задан VVS 12 June 2009 в 16:07
поделиться

5 ответов

Лучший способ явной привязки к определенному методу расширения - вызвать его с использованием синтаксиса общего метода. В вашем случае это можно сделать примерно так:

DumpList(Enumerable.Reverse(list));

Проблема с некоторыми другими подходами, упомянутыми здесь, в том, что они не всегда будут делать то, что вы хотите. Например, приведение списка так:

((IEnumerable)list).Reverse()

может закончиться вызовом совершенно другого метода в зависимости от импортированных вами пространств имен или от того, в каком типе определен вызывающий код.

Единственный способ быть на 100% уверенным в том, что вы привязка к определенному методу расширения заключается в использовании синтаксиса общего метода.

14
ответ дан 3 December 2019 в 03:53
поделиться
var list = new List<int>(new [] {1, 2, 3});
DumpList((list as IEnumerable<int>).Reverse());

ИЛИ

IEnumerable<int> list = new List<int>(new [] {1, 2, 3});
DumpList(list.Reverse());
9
ответ дан 3 December 2019 в 03:53
поделиться

Кажется, это работает

   var stuff = new List<int>();
   var list = Enumerable.Reverse(stuff);
1
ответ дан 3 December 2019 в 03:53
поделиться

Вам не нужно приводить параметр, чтобы выбрать правильный метод ... вам просто нужно уточнить метод.

List<int> list = new List<int>() {1, 2, 3};
DumpList(Enumerable.Reverse(list)); 
2
ответ дан 3 December 2019 в 03:53
поделиться

Если вы не возражаете против безобразия, и вы написали метод расширения, вы всегда можете вызвать:

MyExtensions.Reverse(list);

По сути, это просто статический метод. Я понял это вчера, когда ReSharper сошел с ума и решил переписать половину моих методов расширения как вызовы статического метода.

Что касается использования IEnumerable vs. List , похоже, что просто. Моей первой мыслью было бы использовать:

IEnumerable<T>.Reverse<T>(list);

Но это дает мне ошибку компилятора, и ответ Джона верен для IEnumerable / List.

0
ответ дан 3 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

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