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.
Вы не можете. Это ключевая часть 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
.
Это зависит от того, хотите ли вы, чтобы ваши объекты могли объединять объекты разных типов или нет.
Для однородного слияния все, что вам нужно, это:
public interface IMerger<TSource, TDestination> {
TDestination Merge(IEnumerable<TSource> sources, TDestination destination);
}
Для разнородного слияния рассмотрите возможность того, что все типы источников должны быть производными от общий базовый тип:
public interface IMerger<TSourceBase, TDestination> {
TDestination Merge(IEnumerable<TSourceBase> sources, TDestination destination);
}
Я не вижу необходимости в массиве параметров, просто передайте коллекцию объектов.
Параметры могут быть только в конце или списках аргументов и являются синтаксическим сахаром для массива:
public interface IMerger<TSources, TDestination>
{
TDestination Merge(TDestination destination, params TSource[] sources);
}
Если вы хотите разрешить использование любого типа, просто используйте объект [ ]
вместо TSource.
Примечание: MS имела эту «проблему» также, когда они выполняли материал Expression. Они придумали группу делегатов Action <>
и Func <>
с разным количеством общих аргументов, но на самом деле каждый делегат представляет собой другой тип.
Ключевое слово params
используется только в сигнатуре метода, это не то, чем можно украсить тип. Таким образом, типом по-прежнему является TSources
, и вы должны поместить параметр, украшенный params
последним в сигнатуре метода:
public interface IMerger<TSources, TDestination> {
TDestination Merge(TDestination destination, params TSources[] sources);
}