C#:非通用接口w /泛型方法,泛型实现......(编译时)类型安全?

时间:2017-02-08 09:24:48

标签: c# generics interface implementation

这里可能有线程可以解释它,但是我的google fu似乎不够好找到它们。

我有一个非常常见的问题:我希望有一个非泛型接口,我可以放入某种可枚举的接口,但接口的一个方法将有一个通用的输入参数,但作为输入参数,它的类型是可推断的。

由于各种原因,我希望我的实现是通用的,因为上面提到的输入参数在实现中的更多位置使用,其中包括作为属性的类型。

让我举一个例子说明如何实现它以使我更清楚我的意思:

public interface IThreshold
{
    /* various (non-generic) methods and properties */
    bool ThresholdExceeded<T>(T value) where T : IComparable<T>, IEquatable<T>;
}

public class Threshold<T> : IThreshold where T : IComparable<T>, IEquatable<T>
{
    /* various (non-generic) methods and properties */
    T ThresholdValue { get; }
    bool IThreshold.ThresholdExceeded<U>(U value) where U : IComparable<U>, IEquatable<U> => ThresholdExceeded((T)(object)value);
    public bool ThresholdExceeded(T value)
    {
        // ...
    }
}

[…]
((IThreshold)thresholdOfIntInstance).ThresholdExceeded(5) ? DoSomething();

这将起作用(除非我在为示例简化时引入了错误),然而,类型安全当然超出了(T)(object)value强制转换的窗口。
当然,我宁愿进行编译时类型检查而不是可能的运行时InvalidCastException 但与此同时,我不能简单地将我的实现T用作ThresholdExceeded输入类型,因为

  • 如果我遗漏IThreshold.ThresholdExceeded<U>,它就不会重新认识ThresholdExceeded(T value)作为接口方法的实现(当然,T与编译器不同)
  • 如果我将IThreshold.ThresholdExceeded<U>的约束更改为where U : IComparable<U>, IEquatable<U>, T或类似的东西,编译器会抱怨实现中的约束不再与接口匹配(我想知道为什么,因为它们只是更严格,但好啊)

是否有一种模式允许我以一种方式实现这一点,以保持编译时类型检查以及使用任何类型调用接口方法的舒适性,而不首先转换为特定实现(当然,在保持接口本身不是通用的同时,我可以在IEnumerable中有多个泛型实例,并在不先抛出它们的情况下调用它们的方法)?

0 个答案:

没有答案
相关问题