Разрешение перегрузки выполняется во время компиляции, даже для универсальных методов.Предпочтительным решением было бы вообще не использовать универсальный метод здесь, поскольку вы не можете ограничить T
типами, которые работают, чтобы люди не могли вызывать ISqrtN<DateTime>
и т. Д.
Временные решения, поддерживающие универсальный методДля подписи используется либо dynamic
привязка во время выполнения:
T ISqrtN<T>(T N) => (T)Math.Sqrt((dynamic)N);
, либо ручная проверка типов и приведение к конкретным поддерживаемым типам:
T ISqrtN<T>(T N)
{
if (typeof(T) == typeof(uint))
return (T)(object)(uint)Math.Sqrt((uint)(object)N);
else if (typeof(T) == typeof(ulong))
return (T)(object)(ulong)Math.Sqrt((ulong)(object)N);
else
throw new ArgumentException();
}
Требуются промежуточные (object)
приведения, потому что C #не разрешит прямое приведение от T
до uint
, но они не будут иметь значения во время выполнения.