gpt4 book ai didi

C# 4.0 默认参数

转载 作者:行者123 更新时间:2023-11-30 14:16:11 25 4
gpt4 key购买 nike

考虑以下控制台应用程序:

class Program
{
static void Main()
{
MyInterface test = new MyClass();
test.MyMethod();

Console.ReadKey();
}
}

interface MyInterface
{
void MyMethod(string myString = "I am the default value on the interface");
}

class MyClass : MyInterface
{
public void MyMethod(string myString = "I am the default value set on the implementing class")
{
Console.WriteLine(myString);
}
}

这个程序的输出是:

I am the default value on the interface

(1) 为什么没有一种方法可以在不提供值的情况下在接口(interface)上将参数指定为可选参数。 我认为默认值是实现细节。如果我们以预可选参数样式编写此代码,我们将在接口(interface)中创建两个重载,并将在实现类中指定默认值。 IE。我们会:

interface MyInterface
{
void MyMethod();

void MyMethod(string myString);
}

class MyClass : MyInterface
{
public void MyMethod()
{
MyMethod("I am the default value set on the implementing class");
}

public void MyMethod(string myString)
{
Console.WriteLine(myString);
}
}

哪些输出符合我们的预期,

I am the default value set on the implementing class

(2)为什么我们不能在实现类中覆盖默认值!

最佳答案

.Net 中的默认值实际上是基于编译器的语法糖。在调用站点,编译器会为您添加默认值。它无法在编译时知道对象的运行时类型,因此它必须插入接口(interface)中定义的值。

因此,它们不能在实现中被“覆盖”,因为没有什么可以覆盖。

Eric Lippert 写了一系列关于可选参数主题的非常有趣的博客文章,第一篇可以找到 here .

更新
根据您的评论,您的建议是某种形式的“虚拟”参数(运行时类型在其中声明),CLR 必须“知道”。我猜这个实现被排除是因为成本(设计、文档、实现、测试等)与它带来的好处相比太高了(尽管这只是一个猜测!)。或者,有默认的委托(delegate)方法选项,即:

void M(bool y = false) { ... whatever ... }

被编译器重写为:

void M() { M(false); }
void M(bool y) { ... whatever ... }

但是一旦考虑到多个可选参数和命名参数,沿着这条路线走下去会导致潜在的 Not Acceptable 重载水平。

关于C# 4.0 默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8124847/

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