Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可选参数和继承_C#_Inheritance_Optional Parameters - Fatal编程技术网

C# 可选参数和继承

C# 可选参数和继承,c#,inheritance,optional-parameters,C#,Inheritance,Optional Parameters,我了解可选参数,并且非常喜欢它们,但我只想了解更多关于如何将它们与继承接口一起使用的信息 附件A interface IMyInterface { string Get(); string Get(string str); } class MyClass : IMyInterface { public string Get(string str = null) { return str; } } 现在我认为MyClass中的Get方法继

我了解可选参数,并且非常喜欢它们,但我只想了解更多关于如何将它们与继承接口一起使用的信息

附件A

interface IMyInterface
{
    string Get();
    string Get(string str);
}

class MyClass : IMyInterface
{
    public string Get(string str = null)
    {
        return str;
    }
}
现在我认为
MyClass
中的
Get
方法继承了接口的两个方法,但是

“MyClass”未实现接口成员“MyInterface.Get()”

有什么好的理由吗

也许我应该把可选参数放在你说的界面上?但是这个呢

附件B

interface IMyInterface
{
    string Get(string str= "Default");
}

class MyClass : IMyInterface
{
    public string Get(string str = "A different string!")
    {
        return str;
    }
}
这段代码编译得很好。但这肯定不对吧?经过进一步挖掘,我发现:

  IMyInterface obj = new MyClass();
  Console.WriteLine(obj.Get()); // writes "Default"

  MyClass cls = new MyClass();
  Console.WriteLine(cls.Get()); // writes "A different string!"
调用代码似乎是基于声明的对象类型获取可选参数的值,然后将其传递给方法。在我看来,这似乎有点愚蠢。可能可选参数和方法重载在应该使用时都有它们的场景

我的问题

我的调用代码被传递给
IMyInterface
的一个实例,需要在这里的不同点调用这两个方法

我会被迫在每个实现中实现相同的方法重载吗

public string Get()
{
  return Get("Default");
}

我也没有意识到,可选参数不会改变方法签名。因此,以下代码是完全合法的,实际上是我的解决方案:

interface IMyInterface
{
    string Get(string str = "Default");
}

class MyClass : IMyInterface
{
    public string Get(string str)
    {
        return str;
    }
}

因此,如果我有一个
MyClass
的实例,我必须调用
Get(string str)
,但是如果该实例已声明为基本接口
IMyInterface
,我仍然可以调用
Get()
,它首先从
IMyInterface
获取默认值,然后调用该方法。

参见Eric Lippert的+1,这告诉我永远不要使用可选参数定义接口。“太多模棱两可了!”格塔诺尔问了这个问题之后,我发现了更多。我想我会把它贴出来作为问题的答案,因为我确实找到了一个解决方案。说吧,这里经常发生。(当然,你知道)我真的不认为在接口上允许使用默认参数。它们是一个实现细节。考虑到你也可以有<代码>公共字符串get(string WoViWiWin)。接口的某些部分是承诺(承诺获取字符串并返回字符串),一些是提示(建议让调用代码省略参数,让编译器使用“Default”将其更改为调用),还有一些是文档(除非按名称调用,否则参数的名称并不重要)。