实现从非泛型接口继承的通用接口

时间:2016-03-03 14:26:15

标签: c# generics

我知道如何实现一个继承非通用接口的通用接口,但在这个过程中有一些我不理解的东西:

为什么在实现接口的类中不能将非泛型接口方法声明为public?

一个例子:

    interface InputTestSocket
    {
        object GetValue();
    }

    interface InputTestSocket<T> : InputTestSocket
    {
        new T GetValue();
    }

    class FloatInputSocketValues : InputTestSocket<float>
    {
        IFloatConvertable _output;
        public void SetConvertable(IFloatConvertable output) { _output = output; }

        //If I make this method public it won't compile. Musn't all interfaces be public?
        object InputTestSocket.GetValue() { return null; }

        public float GetValue() { return _output.ToFloat(); }
    }

1 个答案:

答案 0 :(得分:3)

这称为接口的显式实现。如果您不(或不能)将成员作为具体类型的实例成员公开,而只是通过接口使它们可用,则可以这样做。

编译器抱怨的原因是:

  

CS0111类型'FloatInputSocketValues'已经定义了一个名为'GetValue'的成员,其参数类型相同

是两个成员之间只能通过返回类型区分,如果你将方法公之于众,你会有:

//If I make this method public it won't compile. Musn't all interfaces be public?
public object GetValue() { return null; }

public float GetValue() { return _output.ToFloat(); }

并且这两者仅因其返回类型而不同。

所以你不能这样做。

您不能这样做的原因是当编译器在您执行此操作时尝试确定要调用的方法时:

something.GetValue()

是它根本不考虑返回类型。因此,编译器告诉您,您无法调用此方法,因为它不明确,因此它不允许您这样做。

这与泛型或继承无关,但是你会在这个较小的例子中得到完全相同的问题:

interface ITest
{
    object GetValue();
}

public class Test : ITest
{
    public object GetValue() { return null; }

    // just a public method on our class
    public float GetValue() { return 0.0f; }
}