2
interface I1
{
}
class ClassOfI1 : I1
{
}

interface I2
{
    I1 ABC { get; set; }
}
class ClassOfI2 : I2
{
    public ClassOfI1 ABC { get; set; }
}

引发以下错误:

“ns.ClassOfI2”没有实现接口成员“ns.I2.ABC”。“ns.ClassOfI2.ABC”无法实现“ns.I2.ABC”,因为它没有匹配的返回类型“ns.I1”。

为什么?(有没有办法解决这个问题?我想要ClassOfI1那里,而不仅仅是界面。)

4

4 回答 4

4

实现接口时,返回类型必须完全匹配。C# 不支持返回类型协方差。因此,您的实现应该是:

class ClassOfI2 : I2
{
    public I1 ABC { get; set; }
}

即使这样做,您的代码也会不安全,因为您可以这样做:

public class Other : I1 { ... }
I2 iface = new ClassOfI2();
iface.ABC = new Other();

您可以考虑使用泛型:

interface I2<T> where T : I1
{
    T ABC { get; set; }
}

class ClassOfI2 : I2<ClassOfI1>
{
    public ClassOfI1 ABC { get; set; }
}
于 2013-09-11T21:02:44.090 回答
1

因为您的方法返回 ClassOfI1 而不是 I1!它应该返回接口本身。稍后您可以返回一个具体类(在本例中为 ClassOfI1),但实现中的定义必须与接口中的定义相匹配!因此,将您的代码更改为:

interface I1
{
}

class ClassOfI1 : I1
{
}

interface I2
{
    I1 ABC { get; set; }
}

class ClassOfI2 : I2
{
    public I1 ABC { get; set; }
}

它应该可以工作。

您可以稍后在代码中使用 ClassOfI1 的实例,例如:

var c1 = new ClassOfI1();
var c2 = new ClassOfI2();
c2.ABC = c1;
于 2013-09-11T21:00:03.670 回答
0

这是一种方法:

class ClassOfI2 : I2
{
    ClassOfI1 _ABC;
    public I1 ABC { get { return _ABC; } set { _ABC = (ClassOfI1)value; } }
}

请注意,这将在 Lee 在他的回答中提出的情况下引发异常,但是当ClassOfI1仅与 's 一起使用时 - 它运行良好。

于 2013-09-12T11:19:27.487 回答
0

我刚刚看到了这个答案,这似乎是正确的方法:通用接口

它的短处:

MakeABC的类型(输入I2):T where T: I1

于 2014-01-15T15:30:08.953 回答