Конфликтующие ограничения 'value' и 'System.Enum' при использовании явной реализации интерфейса - PullRequest
0 голосов
/ 03 июня 2019

Я строю расширяемую систему для преобразования между различными типами перечислений.Идея состоит в том, что разработчик может наследовать класс BaseEnumConverter и предоставлять реализацию абстрактного метода Convert<TDestinationEnumType>.

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

Я ввел это правило в действие, используя интерфейс, закрытый метод и явную реализацию интерфейса:

public interface IEnumConverter
{
    TDestinationEnumType? Convert<TDestinationEnumType>(Enum sourceEnumValue) where TDestinationEnumType : struct, Enum;
}

public abstract class BaseEnumConverter : IEnumConverter
{
    public abstract TDestinationEnumType? Convert<TDestinationEnumType>(Enum sourceEnumValue)
        where TDestinationEnumType : struct, Enum;

    private TDestinationEnumType? ConvertWithValidation<TDestinationEnumType>(Enum sourceEnumValue)
        where TDestinationEnumType : struct, Enum
    {
        if (sourceEnumValue.GetType() == typeof(TDestinationEnumType))
        {
            return (TDestinationEnumType)sourceEnumValue;
        }
        return Convert<TDestinationEnumType>(sourceEnumValue);
    }

    TDestinationEnumType? IEnumConverter.Convert<TDestinationEnumType>(Enum sourceEnumValue)
    {
        return ConvertWithValidation<TDestinationEnumType>(sourceEnumValue);
    }
}

Таким образом, любые вызовы ссылки на IEnumConverter автоматически запускают логику проверки, а затем логику преобразования.

Проблема

Подпись для явного определения интерфейса имеет следующую ошибку компиляции:

Type parameter 'TDestinationEnumType' inherits conflicting constraints 'value' and 'System.Enum'

УдалениеОграничение struct удаляет ошибку компиляции, однако затем мешает мне вернуть нулевой результат из метода Convert, что также является обязательным требованием для этой системы.

Итак, что я хотел бы знать:

  • Что именно вызывает эту ошибку?
  • Есть ли обходные пути?Не возвращать ноль не вариант для меня.

1 Ответ

0 голосов
/ 04 июня 2019

При дальнейшем расследовании это похоже на проблему с ReSharper.

...