-2

我写了一个简单的类,例如:

public class Pusher : IPusher,Hub
{
}

我得到编译错误(Interface definition is expected),因为我们应该首先从类继承,然后是其他接口。

public class Pusher : Hub,IPusher但是和之间有什么区别public class Pusher : IPusher,Hub

我们也可以在具有默认值的方法参数中看到这样的对流

public void ExampleMethod(int required, string optionalstr = "default string")

我们应该在参数的最后定义默认值参数。

这与CLR有关吗?

4

2 回答 2

2

不,它与 CLR 无关,这些是特定于语言的限制。

我无法确切找到为什么必须将继承的类放在接口之前,但这可能是为了清楚起见。该类只能从另一个类继承,但可以实现多个接口。如果您知道被继承的类总是放在第一位,就更容易看到发生了什么。

可选参数的排序更具实用性。C# 不允许空参数作为可选参数的占位符,因此您必须将它们放在最后(否则只能使用命名参数调用方法)。您不能像这样调用该方法:

ExampleMethod(42, );

要使用可选值调用,只需在调用中省略它:

ExampleMethod(42);

因此,如果可选参数不是最后一个,它就不是可选的,因为你不能这样调用:

ExampleMethod(, 42);
于 2013-03-09T17:38:23.497 回答
1

好吧,在第一种情况下,这只是一个约定。为了更好的可读性和编译时检查的简单性,我希望该类应该放在首位。但论点是另一种情况。想象一下,您为第一个参数指定默认值,而不是最新的参数。编译器应该如何检测您想说的内容。

示例: int func(int a, int b = 10, int c) 并且您调用func(10, 20); 这应该做什么?不能这么说。

编辑(示例 2): int func(int a, int b = 1, int c, int d = 2, int e) 并调用func(1,2,3,4); 在这种情况下,不清楚哪个变量被省略了。它可以是 B 和 D。

于 2013-03-09T17:35:04.177 回答