2

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

作为一个简化的示例:我在接口中默认为 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);

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

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

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

我缺少哪些主要的设计考虑因素使这种优先考虑?

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

4

2 回答 2

3

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

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

于 2013-10-21T17:25:28.877 回答
1

这是因为 - 像扩展方法一样 - 可选参数是编译器技巧而不是真正的语言功能。

如此恰当 - 使用扩展方法解决问题:

public interface IDoSomething {
    void DoThis(int parameter);
}

public static class DoSomethingDefaults {
    public static void DoThis(this IDoSomething x) {
        x.DoSomething(123); //default value
    }
}

///
new ClassThatImplementsDoSomething().DoThis();
new ClassThatImplementsDoSomething().DoThis(456);

它不像真正的可选参数那样看起来超级漂亮,但在大多数情况下,它们做同样的事情并且工作正常。

将默认值与您的界面一起保留(我什至建议使用相同的文件),希望您的项目的新手跟踪正在发生的事情不会太难。

于 2013-10-21T17:27:57.067 回答