Обобщения являются функцией времени компиляции, разрешение перегрузки было решено еще до запуска программы. Если вы хотите, как вы говорите, принудительно принять решение во время выполнения, вы можете использовать dynamic
для достижения этой цели (в C # 4+). Если не считать этого, вы просто должны привести к соответствующему типу между int и bool в противном случае.
if (arg.HasValue)
Foo((dynamic)arg.Value, defaultValue);
Но будьте осторожны! Это решит вашу проблему только для int
и bool
. Другие типы могут быть переданы универсальному методу, и они будут продолжать преобразовываться в универсальный метод при последующем вызове.
Foo(5.0, 10.0); // would still overflow with your given methods
Следуйте вашему первоначальному суждению, если вы хотите поддерживать int
, string
и bool
, просто имейте эти перегрузки. Если вы хотите поддерживать любой данный T, создайте перегрузку для T.
static void Foo<T>(T arg, T defaultValue)
{
Console.WriteLine(string.Format("I'm a T arg={0}, default={1}", arg, defaultValue));
}
Разрешение перегрузки будет по-прежнему выбирать перегрузки int
, bool
, string
или T?
, если они применимы на основе информации времени компиляции . Все остальные вызовы, и вызов с arg.Value
, перейдут к этой новой перегрузке.