使用显式接口实现时冲突约束 'value' 和 'System.Enum'
Conflicting constraints 'value' and 'System.Enum' when using explicit interface implementation
我正在构建一个可扩展的系统,用于在各种枚举类型之间进行转换。这个想法是开发人员可以继承 BaseEnumConverter class 并提供抽象方法 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 方法返回空结果,这也是该系统的要求。
所以我想知道的是:
- 到底是什么导致了这个错误?
- 有什么解决方法吗?不返回 null 对我来说不是一个选项。
经进一步调查,这似乎是 ReSharper 的问题。
我正在构建一个可扩展的系统,用于在各种枚举类型之间进行转换。这个想法是开发人员可以继承 BaseEnumConverter class 并提供抽象方法 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 方法返回空结果,这也是该系统的要求。
所以我想知道的是:
- 到底是什么导致了这个错误?
- 有什么解决方法吗?不返回 null 对我来说不是一个选项。
经进一步调查,这似乎是 ReSharper 的问题。