Я хотел бы различать следующие случаи:
- Тип простого значения (например,
int
)
- Тип значения обнуляемый (например,
int?
)
- Тип ссылки (например,
string
) - опционально, мне было бы все равно, если это сопоставлено с (1) или (2) выше
Я придумал следующий код, который отлично работает для случаев (1) и (2):
static void Foo<T>(T a) where T : struct { } // 1
static void Foo<T>(T? a) where T : struct { } // 2
Однако, если я попытаюсь обнаружить case (3) следующим образом, он не скомпилируется:
static void Foo<T>(T a) where T : class { } // 3
Сообщение об ошибке: Тип «X» уже определяет элемент с именем «Foo» с такими же типами параметров . Ну, как-то я не могу сделать разницу между where T : struct
и where T : class
.
Если я удалю третью функцию (3), следующий код также не скомпилируется:
int x = 1;
int? y = 2;
string z = "a";
Foo (x); // OK, calls (1)
Foo (y); // OK, calls (2)
Foo (z); // error: the type 'string' must be a non-nullable value type ...
Как мне получить Foo(z)
для компиляции, сопоставив его с одной из вышеперечисленных функций (или с третьей с другим ограничением, о котором я не думал)?