Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# - Fatal编程技术网

C# 为什么可以';我不能用这种方式实现接口吗?

C# 为什么可以';我不能用这种方式实现接口吗?,c#,C#,可能重复: 我不确定我是否只是在做傻事 如果我有一个接口: public interface IMoop { object Moop(); } 为什么我不能这样实现它(我想这会使用隐式协方差?) MoopImplementor的任何实例都会符合IMoop指定的合同,所以看起来这应该是可以的 请告诉我:) EDIT:需要澄清的是,由于实现类返回从接口方法的返回类型继承的内容,我觉得这应该可以工作。具体来说,字符串是一个对象。(对于任何其他固有链也是如此)。因为接口指定该方法必须返回一个

可能重复:

我不确定我是否只是在做傻事

如果我有一个接口:

public interface IMoop
{
    object Moop();
}
为什么我不能这样实现它(我想这会使用隐式协方差?)

MoopImplementor的任何实例都会符合IMoop指定的合同,所以看起来这应该是可以的

请告诉我:)


EDIT:需要澄清的是,由于实现类返回从接口方法的返回类型继承的内容,我觉得这应该可以工作。具体来说,
字符串
是一个
对象
。(对于任何其他固有链也是如此)。

因为接口指定该方法必须返回一个
对象。
字符串
可以继承自
对象
,但接口指定了一个返回更一般类型的方法

但是,请记住,没有什么可以阻止您执行以下操作:

public object Moop()
{
    return "Some new string";
}

你没有履行合同。但是,可以使用泛型执行此操作:

public interface IMoop<T>
{
    T Moop();
}

public class MoopImplementor : IMoop<string>
{
    public string Moop() { return ""; }
}
公共接口IMoop
{
T Moop();
}
公共类MoopleMentor:IMoop
{
公共字符串Moop(){return”“;}
}

合理的解决方法:

公共类MoopImplementor:IMoop{
公共字符串Moop(){…}
对象IMoop.Moop(){return Moop();}
}
这使得
moopipplementor
上的公共实现具有更精确的类型,同时仍然满足接口的要求。

来自:

13.4.4接口映射 出于接口映射的目的,类成员a与 接口成员B在以下情况下:

  • A和B是方法,A和B的名称、类型和形式参数列表是相同的
请注意,它没有提到任何关于继承或可转换性的内容!返回类型必须相同。

C#不支持用于接口实现或虚拟方法覆盖的返回类型协方差。有关详细信息,请参见此问题:

C#不支持从C#4开始使用类型参数的引用类型构造的接口和委托类型的通用协方差和逆变

当将返回引用类型的方法转换为返回类型为兼容引用类型的委托类型时,C#不支持返回类型协方差。(同样,它也支持参数类型逆变。)

如果你对这个主题感兴趣的话,我已经写了很多文章来讨论C#支持和不支持的不同版本的方差。看



详细信息。

@Dave:这里的编译器很严格。您需要使
Moop()
明确地返回一个
对象
,否则就无法实现该接口。这不是问题,因为您可以简单地从方法返回
字符串,正如您正确指出的那样。从技术上讲,合同还允许我返回您的实现没有返回的整数。是的-我理解这一点。但问题是什么:)@kailoon不,不是。契约允许您返回作为对象装箱的整数,但不能返回整数。这些是不同的。关于你的编辑
,我觉得这应该行得通
-我觉得人们应该给我免费的钱,不是这样的。但是字符串是一个对象。@Dave:这就是为什么我们有专门的接口:p(我明白你的意思)无论我在哪里使用它作为接口-“字符串”或任何其他符合“成为一个物体”。@Dave:你的观点是无关紧要的。它就是这样。你的观点是什么?@NiklasB。Dave提出的问题是“为什么是这样”。我猜你的回答是“它就是这样”“对我来说,这听起来不是个好答案。也许Jon Skeet会跟进,看看C#是否有不允许的理由。@asawyer:+1表示尼斯answer@NiklasB. 我同意,这是另一回事。对不起,这不是问题所在。@Dave答案是您在实现中没有履行接口的合同义务。用另一种方式做。这一直困扰着我。特别是
IEnumerable
等。但我想我们必须做我们必须做的事情。虽然这很好,但它没有提到这背后的任何理由:)天哪,你不是在开玩笑吧-11篇关于差异的博客文章。我的整个下午都过去了:)
public interface IMoop<T>
{
    T Moop();
}

public class MoopImplementor : IMoop<string>
{
    public string Moop() { return ""; }
}