gpt4 book ai didi

c# - 为什么在接口(interface)上定义的 C# 4 可选参数没有在实现类上强制执行?

转载 作者:IT王子 更新时间:2023-10-29 03:27:58 26 4
gpt4 key购买 nike

我注意到,对于 C# 4 中的可选参数,如果您在接口(interface)上指定一个可选参数,您don,t 必须使该参数在任何实现类上都是可选的:

public interface MyInterface
{
void TestMethod(bool flag = false);
}

public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}

因此:

var obj = new MyClass();        
obj.TestMethod(); // compiler error

var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false

有谁知道为什么可选参数设计成这种方式?

一方面,我认为覆盖接口(interface)上指定的任何默认值的能力很有用,但老实说,我不确定你是否应该能够在接口(interface)上指定默认值,因为这应该是一个实现决定.

另一方面,这种分离意味着您不能总是交替使用具体类和接口(interface)。如果在实现中指定了默认值,这当然不会成为问题,但是如果您将具体类公开为接口(interface)(例如使用一些 IOC 框架来注入(inject)具体类),那么就真的没有了point 具有默认值,因为调用者无论如何都必须始终提供它。

最佳答案

更新:This question was the subject of my blog on May 12th 2011. Thanks for the great question!

假设您有一个您描述的接口(interface),以及一百个实现它的类。然后您决定将接口(interface)方法之一的参数之一设为可选。您是否建议编译器强制开发人员找到该接口(interface)方法的每个实现,并将参数也设为可选?

假设我们这样做了。现在假设开发人员没有实现的源代码:


// in metadata:
public class B
{
public void TestMethod(bool b) {}
}

// in source code
interface MyInterface
{
void TestMethod(bool b = false);
}
class D : B, MyInterface {}
// Legal because D's base class has a public method
// that implements the interface method

D 的作者应该如何完成这项工作?他们是否需要在您的世界中调用 B 的作者,并请他们向他们发送一个新版本的 B,使该方法具有可选参数?

那不会飞。如果 两个 人调用 B 的作者,其中一个想要默认值是 true 而另一个想要默认值是 false 怎么办?如果 B 的作者只是拒绝一起玩怎么办?

也许在那种情况下他们会被要求说:

class D : B, MyInterface 
{
public new void TestMethod(bool b = false)
{
base.TestMethod(b);
}
}

提议的功能似乎给程序员增加了很多不便,而代表权却没有相应的增加。此功能有什么引人注目的好处可以证明增加用户的成本是合理的?


更新:在下面的评论中,supercat 提出了一种语言功能,它可以真正增强语言的功能,并支持一些类似于此问题中描述的场景。仅供引用,该功能——接口(interface)中方法的默认实现——将添加到 C# 8。

关于c# - 为什么在接口(interface)上定义的 C# 4 可选参数没有在实现类上强制执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4922714/

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