Вопрос по дженерикам и боксинге
Я хочу "оптимизировать" стандартный метод HasFlag структуры Enum, но в виде дженерика.
вот что получилось:
public static bool HasAnyFlag<T>(this T value, T flag) where T : IBinaryInteger<T>
{
return (value & flag) != T.Zero; //просто 0 тут нельзя поставить
}
public static bool HasFlag<T>(this T value, T flag) where T : IBinaryInteger<T>
{
return (value & flag) == flag;
}
Теперь о моих догадках:
- where T : IBinaryInteger по моему мнению не должно вызывать boxing типа Т так как эта запись является статической проверкой на этапе компиляции
- Однако в методе HasAnyFlag выражение
return (value & flag) != T.Zero;
наверное вызывает проблему, так как параметр Zero является членом интерфейса IBinaryInteger (или его базовых),а также операторы & и != являются членами этих интерфейсов. А раз так - то должна происходит упаковка
В итоге, все эти "крутые новшевства" NET 7 - можно засунуть? Почему не сделать бы до путя? Или я не вкурил как этим пользоваться?
Любые другие попытки обойти это всеравно приводят к использованию методов, которые являются членами класса Object или принимают Object в качестве аргумента.
Неужели нельзя ничего сделать?
П.С. В итоге enum не реализуют эти интерфейсы. И это не работает(( Но с обычными базовыми структурами похоже нет никакого боксинга, потому как методы являются виртуальными и переопределяются где-то в структуре, а может это оптимизированно для базовых типов, не знаю. Но этих методов в базовых типах я не нашел 