gpt4 book ai didi

c# - 实现从非通用接口(interface)继承的通用接口(interface)

转载 作者:太空狗 更新时间:2023-10-30 01:32:53 25 4
gpt4 key购买 nike

我知道如何实现一个继承自非泛型接口(interface)的泛型接口(interface),但在这个过程中有些地方我不明白:

为什么非泛型接口(interface)方法不能在实现接口(interface)的类中声明为 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(); }
}

最佳答案

这称为接口(interface)的显式实现。当您不会(或不能)将成员公开为具体类型的实例成员时,您会这样做,但只能通过接口(interface)使它们可用。

编译器提示的原因:

CS0111 Type 'FloatInputSocketValues' already defines a member called 'GetValue' with the same parameter types

是你不能仅通过返回类型来区分两个成员,如果你公开该方法,你将拥有:

//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; }
}

关于c# - 实现从非通用接口(interface)继承的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35774853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com