Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类代替接口失败_C#_.net_Interface - Fatal编程技术网

C# 类代替接口失败

C# 类代替接口失败,c#,.net,interface,C#,.net,Interface,引发以下错误: “ns.ClassOfI2”未实现接口成员“ns.I2.ABC”。 “ns.ClassOfI2.ABC”无法实现“ns.I2.ABC”,因为它没有实现 具有匹配的返回类型“ns.I1” 为什么??(有什么方法可以解决这个问题吗?我想要ClassOfI1,而不仅仅是接口。)因为您的方法返回的是ClassOfI1而不是I1!它应该返回接口本身。稍后,您可以返回一个具体的类(在本例中为ClassOfI1),但实现中的定义必须与接口中的定义相匹配! 因此,请将代码更改为: interfa

引发以下错误:

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


为什么??(有什么方法可以解决这个问题吗?我想要
ClassOfI1
,而不仅仅是接口。)

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

interface I1
{
}
class ClassOfI1 : I1
{
}

interface I2
{
    I1 ABC { get; set; }
}
class ClassOfI2 : I2
{
    public ClassOfI1 ABC { get; set; }
}
它应该会起作用

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

interface I1
{
}

class ClassOfI1 : I1
{
}

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

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

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

var c1 = new ClassOfI1();
var c2 = new ClassOfI2();
c2.ABC = c1;
即使这样,您的代码也将不安全,因为您可以:

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

你可以考虑使用泛型:

public class Other : I1 { ... }
I2 iface = new ClassOfI2();
iface.ABC = new Other();
接口I2,其中T:I1
{
T ABC{get;set;}
}
类别ClassOfI2:I2
{
公共类OFI1 ABC{get;set;}
}
以下是一种方法:

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

class ClassOfI2 : I2<ClassOfI1>
{
    public ClassOfI1 ABC { get; set; }
}
请注意,对于Lee在其回答中提出的情况,这将引发一个异常,但当仅与
ClassOfI1
一起使用时,它运行良好。

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

简而言之:


创建
ABC
的类型(在
I2
中):T
其中T:I1

,但应该可以用类替换接口。正如您可以使用
列表
代替
IEnumerable
。此时不可以-稍后在代码中的某个点可以,您可以执行object.ABC=ClassOfI1Instance,但该方法必须与接口的定义相匹配!对于任何看到这个答案的人-我接受了这个答案,但也发布了一个带有“变通方法”的答案,以获得想要的结果。(@)Lee感谢你的回答。然而,您关于我的代码不安全的部分有一个输入错误-您的意思是
。。。其他:I1…
,对吗?@ispiro-是的,应该是
I1
,对此表示抱歉。
class ClassOfI2 : I2
{
    ClassOfI1 _ABC;
    public I1 ABC { get { return _ABC; } set { _ABC = (ClassOfI1)value; } }
}