довольно часто запрашиваемая новая функция для C#: возможность указывать более общие ограничения параметров, чем те, которые у нас уже есть. Операторы являются одними из наиболее часто задаваемых вопросов. Однако C# в настоящее время не поддерживает это.
Возможные обходные пути:
Передайте делегат любому методу, который должен выполнять сложение. Это наиболее типобезопасный вариант, но, конечно, он раздражает, если вам нужно часто вызывать такой метод. Например:
открытый класс Generic {
public void DoSomething(T anItem, T AnotherItem, Func add) {
// вместо
Бла (предмет + другой предмет);
// нужно написать:
Бла (добавить (элемент, другой элемент));
}
}
Generic genInt = ...;
// и тогда вместо...
genInt.DoSomething(1, 2);
// нужно написать:
genInt.DoSomething(1, 2, (a, b) => a + b);
Объявите свой собственный интерфейс IAdable
. Затем вы можете использовать его как ограничение параметра универсального типа, но, очевидно, вы не можете использовать int
в качестве параметра.Вам придется использовать собственную struct
, содержащую только int
и реализующую IAdable
:
public interface IAddable {
T Добавить(T другое);
}
общедоступная структура Integer: IAddable {
общедоступное значение;
общественное целое (целое значение) { значение = значение; }
public Integer Add (Integer other) { return new Integer (Value + other.Value); }
}
// тогда вместо
Общий blah = ...;
// нужно написать:
Generic blah = ...;
динамический
. Другой возможный обходной путь — использовать dynamic
, но это довольно хакерский и совершенно небезопасный способ: он позволит передать любой тип и вызвать любой метод или оператор, и произойдет сбой только во время выполнения, а не при компиляции. -время.
В C# 4.0 появилось новое ключевое слово dynamic, позволяющее выполнять это во время выполнения. В предыдущих версиях это было возможно, но слишком сомнительно и сложно для меня. Но вы всегда можете передать делегата, который будет выполнять дополнения внутри дженерика. В противном случае это невозможно, потому что нет ISummable, IAdditive и, вообще говоря, нет способа узнать, является ли что-то аддитивным * во время компиляции. Если вам нужны дополнительные комментарии, я добавлю их позже. БР.