gpt4 book ai didi

C# 可选参数 : Why can I define the default different on interface and derived class?

转载 作者:行者123 更新时间:2023-12-04 09:36:57 25 4
gpt4 key购买 nike

使用 C#,我们现在可以拥有 可选参数 ,并给他们默认 像这样的值:

public abstract class ImporterBase : IImporter {
public void ImportX(bool skipId = true) {
//....
}
}

现在,假设在我们派生的接口(interface)中,我们有
public interface IImporter {
void ImportX(bool skipId = false);
}

请注意,默认值在基类中的定义与在接口(interface)中的定义不同。这真的很令人困惑,因为现在默认值取决于我是否这样做
IImporter interfaceImporter = new myConcreteImporter(); //which derives from ImporterBase
interfaceImporter.DoX(); //skipId = false

或者
ImporterBase concreteImporter = new myConcreteImporter(); //which derives from ImporterBase
concreteImporter.DoX(); //skipId = true

为什么允许在接口(interface)和派生类中定义不同的默认值?

注: this question similar, but focuses on the optionality, not on the value.

最佳答案

为了澄清,我将问题解释为:

If a method is defined in an interface / base class which has a method which has a parameter with a default value, and a class implements / overrides that method but provides a different default value, why doesn't the compiler warn?



请注意,这不包括实现不提供任何默认值的情况—— Eric Lippert 解释了这种情况。 .

我在 csharplang gitter channel 上问过这个问题,而长期大量参与语言设计的人的回应是:

i think an analyzer sounds very good for this.



从那,以及这里发布的其他链接(甚至没有提到这个具体案例),我最好的猜测是这个具体案例没有被考虑,或者被简单地考虑过但因为太小众而被驳回。当然,一旦 C# 4 发布,就无法在不破坏向后兼容性的情况下添加编译器错误或警告。

您可以编写一个分析器来捕获这种情况(它有一个代码修复来更正默认值),并尝试将其合并到 Roslyn 中。

作为脚注,我可以看到一些会导致问题的情况。

接口(interface)更改其参数之一的默认值

这已经是一个二进制破坏性的变化,这将促进它成为一个源破坏性的变化。

两个默认值不同的接口(interface)
interface I1
{
void Foo(bool x = false);
}
interface I2
{
void Foo(bool x = true);
}
class C : I1, I2
{
...?
}

如果您确实想为 C.Foo 指定默认值,这种情况可以通过显式实现其中一个接口(interface)来解决:
class C : I1, I2
{
public void Foo(bool x = false) { ... }
void I2.Foo(bool x) => Foo(x);
}

或者,您可以忽略这种情况,而不发出警告。

在子类中添加接口(interface)
interface I1
{
void Foo(bool x = false);
}
class Parent
{
public void Foo(bool x = true) { ... }
}
class Child : Parent, I1
{
...?
}

我不确定对此的直观解决方案是什么,但由于它是如此的小众,我很想忽略它,而不是警告。

关于C# 可选参数 : Why can I define the default different on interface and derived class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59665070/

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