Я хотел бы различать следующие случаи:
- Тип простого значения (например,
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
Однако, если я попытаюсь определить случай (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)
для компиляции, сопоставляя его с одной из вышеперечисленных функций (или третьей с другим ограничением, о котором я не думал)?