У меня может быть переменное количество универсальных параметров?

jjngy здесь имеет его правильный. Вот доказательство, что его упрощенная формула эквивалентна исходному использованию Помощник Доказательства Coq .

Require Import Arith.
Require Import Omega.

Lemma eq : forall (a b p:nat),
(((a+p) <= b) /\ ((a = 0) \/ (a > 1)) /\ (b >= p)) /\ 
    ((b - (a + p) = 0) \/ (b - (a + p) > 1)) <-> 
((a + p <= b) /\ ~ (a= 1) /\ ~ (b - a - p = 1)).
Proof. intros; omega. Qed.

36
задан Richard Everett 23 October 2009 в 11:45
поделиться

4 ответа

Вы не можете. Это ключевая часть API. Однако вы можете сделать что-нибудь побочное, например, принять аргумент Type [] . Вы также можете придумать какой-нибудь экзотический способ сделать это «беглым API / методом расширения», но, честно говоря, это того не стоит; но что-то вроде:

obj.Merge<FirstType>(firstData).Merge<SecondType>(secondData)
     .Merge<ThirdType>(thirdData).Execute<TDestination>(dest);

или с выводом общего типа:

obj.Merge(firstData).Merge(secondData).Merge(thirdData).Execute(dest);

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

29
ответ дан 27 November 2019 в 06:13
поделиться

Это зависит от того, хотите ли вы, чтобы ваши объекты могли объединять объекты разных типов или нет.

Для однородного слияния все, что вам нужно, это:

public interface IMerger<TSource, TDestination> {
    TDestination Merge(IEnumerable<TSource> sources, TDestination destination);
}

Для разнородного слияния рассмотрите возможность того, что все типы источников должны быть производными от общий базовый тип:

public interface IMerger<TSourceBase, TDestination> {
    TDestination Merge(IEnumerable<TSourceBase> sources, TDestination destination);
}

Я не вижу необходимости в массиве параметров, просто передайте коллекцию объектов.

5
ответ дан 27 November 2019 в 06:13
поделиться

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

public interface IMerger<TSources, TDestination>
{
  TDestination Merge(TDestination destination, params TSource[] sources);
}

Если вы хотите разрешить использование любого типа, просто используйте объект [ ] вместо TSource.

Примечание: MS имела эту «проблему» также, когда они выполняли материал Expression. Они придумали группу делегатов Action <> и Func <> с разным количеством общих аргументов, но на самом деле каждый делегат представляет собой другой тип.

4
ответ дан 27 November 2019 в 06:13
поделиться

Ключевое слово params используется только в сигнатуре метода, это не то, чем можно украсить тип. Таким образом, типом по-прежнему является TSources , и вы должны поместить параметр, украшенный params последним в сигнатуре метода:

public interface IMerger<TSources, TDestination> {
    TDestination Merge(TDestination destination, params TSources[] sources);
}
0
ответ дан 27 November 2019 в 06:13
поделиться
Другие вопросы по тегам:

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