c# - 可选参数和接口(interface) - 意外结果

标签 c# interface optional-parameters

我支持一些具有可选参数和接口(interface)的代码。

作为一个简化的示例:我在接口(interface)中默认值为 2,在实现类中默认值为 1。

public interface IOptionalInterface
{
    int Get(int x = 2);
}

public class ClassX : IOptionalInterface
{
    public int Get(int x = 1)
    {
        return x;
    }
}

正如我所料,这段代码通过了。

        Assert.AreEqual(new ClassX().Get(), 1);

但是,当我将类作为接口(interface)传回并稍后调用它时,我从接口(interface)获取可选参数;这让我很惊讶。

    private IOptionalInterface Build()
    {
        return new ClassX();
    } 

    public void Expect1()
    {
        var y = Build();
        Assert.AreEqual(y.Get(), 1);  // fails, it returns 2.
    }

我遗漏了哪些主要设计考虑因素,导致了这一点的优先?

是否有一种干净的方法来确保实现类设置默认值?

最佳答案

可选参数是在调用站点调用的纯粹编译时功能。

当您调用带有可选参数的方法时,编译器会查找该参数的默认值并将该文字值插入到调用中。
因此,默认值是根据调用站点的编译时类型解析的。

关于c# - 可选参数和接口(interface) - 意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19500895/

相关文章:

c# - 调试器未命中断点

java - 实现Comparable接口(interface)的问题

java - 如何实现相互矛盾的接口(interface)

f# - 是否可以在 F# 中转发可选参数

c# - Facebook .NET 客户端 SDK 是否支持通过 AppStudio 生成的通用应用程序/应用程序?

C# SocketAsyncEventHandler 在 Complete 上评估操作

c# - 构造函数重载和类参数

c# - 更多关于 Virtual/new...plus 界面的信息!

vb.net - 将可选 Enum 传递给 VB.NET 中的函数

Powershell - 有条件地向 cmdlet 添加参数/参数