Универсальный метод, где T - это type1 или type2

Есть ли способ объявить универсальную функцию, которая имеет универсальный тип type1 или type2?

пример:

public void Foo<T>(T number)
{
}

Могу ли я ограничить T быть целым или длинным

26
задан gdoron is supporting Monica 18 December 2011 в 16:13
поделиться

6 ответов

Хотя вы можете использовать универсальное ограничение , чтобы ограничить тип каждого универсального аргумента T, к сожалению, нет ни одного, который позволил бы вам применять во время компиляции, является ли T type1 or type2.

Также нет способа обеспечить во время компиляции, что ваш универсальный аргумент может быть только любого примитивного типа (int, long, double, ...).

15
ответ дан 28 November 2019 в 07:13
поделиться

Для объектов ReferenceType вы можете сделать

public void DoIt<T>(T someParameter) where T : IMyType
{

}

...

public interface IMyType
{
}

public class Type1 : IMyType
{
}

public class Type2 : IMyType
{
}

В вашем случае использование параметра long as ограничит использование long и int в любом случае.

public void DoIt(long someParameter)
{

}

чтобы ограничиться любыми типами значений (такими как: int, double, short, decimal), вы можете использовать:

public void DoIt<T>(T someParameter) where T : struct
{

}

для получения дополнительной информации вы можете проверить официальную документацию здесь

17
ответ дан 28 November 2019 в 07:13
поделиться

Это не имеет смысла; T не будет иметь пригодного для использования типа времени компиляции в методе.

Вместо этого вы должны сделать два перегруженных метода.

8
ответ дан 28 November 2019 в 07:13
поделиться

Вместо этого используйте перегруженные методы:

public void Foo(int number)
{
} 

public void Foo(long number)
{
}

Вы не можете выполнять арифметические операции с универсальными типами в любом случае. Обратите внимание, что вы можете передать значение int параметру long. Он будет автоматически преобразован в long. Поэтому достаточно иметь только один метод с параметром long.

Старые языки программирования работали по принципу «может быть только один». C # позволяет вам иметь несколько методов с одинаковым именем в одном классе, интерфейсе или структуре. Эти методы должны иметь другую подпись. Это означает, что они должны иметь разное количество параметров или параметры с разными типами (или оба). Это называется перегрузкой метода.

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

Я не думаю, что это в настоящее время возможно.

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

0
ответ дан 28 November 2019 в 07:13
поделиться

У меня также была эта проблема, и я думаю, что нашел лучшее решение (предполагая, что перегруженной версии вашего метода недостаточно):

Смешивание Type1 и Type2 без каких-либо параллелей не имеет никакого смысла как уже было написано. Таким образом, должен быть любой метод или свойство, к которому осуществляется доступ для обоих типов объектов. Чтобы убедиться, что эти методы или свойства доступны для вашего объекта, сгруппируйте Type1 и Type2, создав интерфейс MyInterface и реализовав его с помощью Type1 и Type2:

interface MyInterface {
  void MyCommonMethod();
  bool MyCommonProperty { get; }
}

class Type1 : MyInterface {
  void MyCommonMethod() {
    // TODO: Implement it for Type1
  }

  bool MyCommonProperty {
  get {
    // TODO: Implement it for Type1
  }
  }
}

class Type2 : MyInterface {
  void MyCommonMethod() {
    // TODO: Implement it for Type2
  }

  bool MyCommonProperty {
  get {
    // TODO: Implement it for Type2
  }
  }
}

Теперь, чтобы переписать ваш метод Foo, чтобы принять и Type1, и Type2, ограничение T должно быть объектом MyInterface:

public void Foo<T>(T number) where T : MyInterface
{
  throw new NotImplementedException();
}

Я думаю, это может быть полезно , :)

0
ответ дан 28 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

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