Вопрос по дженерикам и боксинге

Я хочу "оптимизировать" стандартный метод 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;
}

Теперь о моих догадках:

  1. where T : IBinaryInteger по моему мнению не должно вызывать boxing типа Т так как эта запись является статической проверкой на этапе компиляции
  2. Однако в методе HasAnyFlag выражение

return (value & flag) != T.Zero;

наверное вызывает проблему, так как параметр Zero является членом интерфейса IBinaryInteger (или его базовых),а также операторы & и != являются членами этих интерфейсов. А раз так - то должна происходит упаковка

В итоге, все эти "крутые новшевства" NET 7 - можно засунуть? Почему не сделать бы до путя? Или я не вкурил как этим пользоваться?

Любые другие попытки обойти это всеравно приводят к использованию методов, которые являются членами класса Object или принимают Object в качестве аргумента.

Неужели нельзя ничего сделать?

П.С. В итоге enum не реализуют эти интерфейсы. И это не работает(( Но с обычными базовыми структурами похоже нет никакого боксинга, потому как методы являются виртуальными и переопределяются где-то в структуре, а может это оптимизированно для базовых типов, не знаю. Но этих методов в базовых типах я не нашел введите сюда описание изображения


Ответы (0 шт):