Да, с использованием дженериков:
public T Addtoatal<T>(T a, T b) {}
Если метод должен использовать какие-либо операторы (+, -, *) и т. Д., Это будет проблематично, поскольку универсальные типы не могут гарантировать, что класс T имеет оператор (операторы не могут быть объявлены в интерфейсах, и поэтому Вы не можете сделать ограничение, чтобы соответствовать).
В .Net 4.0 вы можете использовать динамическую типизацию, чтобы получить динамическую переменную, содержащую результат, и добавить к ней:
public T Addtoatal<T>(T a, T b) {
dynamic res = a;
a += b;
return res;
}
В других версиях .Net вам нужно будет обойти, например, класс Operator в MiscUtils: универсальный метод для добавления int, float, в c #
Второй пример с тремя параметрами должен иметь другую подпись (в .Net 2.0), поскольку он имеет больше параметров.
в .Net 4.0 вы можете просто использовать необязательные параметры для универсальных типов, но не можете сделать это для типов значений:
public T Addtoatal<T>(T a, T b, T c = null) where T: class { //Do stuff }
Но вы можете использовать бокс с обнуляемыми типами, это будет работать с int и double:
public T Addtoatal<T>(T? a, T? b, T? c = null) where T : struct { //Do stuff, use .Value }
Теперь следующая лучшая вещь, которую вы могли бы сделать, если вы не хотите использовать обобщения, - это иметь одно объявление метода как double (C # 4.0, из-за необязательного параметра):
public double Addtoatal(double a, double b, double c = 0) {}
В этом примере значения int в любом случае будут преобразованы в double, поэтому потеря данных не будет, и int может быть неявно преобразован в double, но возвращаемое значение необходимо будет явно привести к int.