c# -如何在接口中实现默认值(T) ?

本文关键字:默认值 实现 接口 | 更新日期: 2023-09-27 18:07:02

default(T)放到接口中。显式地实现接口。结果不编译

public interface IWhatever<T>
{
   List<T> Foo(T BarObject = default(T));
}
public class ConcreteWhatever: IWhatever<ConcreteWhatever>
{
    List<ConcreteWhatever> Foo(ConcreteWhatever BarObject = default(T)) {}
}

我完全期待default(ConcreteWhatever)。我得到的是default(T),导致编译错误。

我只是进去用null代替default(T),事情就好了。但这太可怕了。为什么会发生这种情况?

c# -如何在接口中实现默认值(T) ?

在本例中没有T,因为ConcreteWherever不是泛型。

如果你想要default(ConcreteWhatever),那么这就是你应该写的代码

你只是在抱怨Visual Studio自动生成的代码吗?如果是这样,这是一个合理的抱怨,但值得明确说明……(注意,这里的不是使用显式接口实现——否则它将被声明为IWhatever<ConcreteWhatever>.Foo。你也没有真正的隐式实现,否则它应该是公共的…)

编辑:我刚刚尝试了同样的事情我自己,并看到了相同的结果,除了方法是公开的。看起来这只是Visual Studio的一个错误——我建议你为它创建一个连接请求。我怀疑这是一个相对少见的情况——创建一个通用接口,指定一个可选参数,使用类型参数的默认值作为值…

这一行是不是应该:

List<ConcreteWhatever> Foo(ConcreteWhatever BarObject = default(T)) {}

:

List<ConcreteWhatever> Foo(ConcreteWhatever BarObject = default(ConcreteWhatever)) {}
public interface IWhatever<T>
{
    List<T> Foo(T BarObject = default(T));
}
public class ConcreteWhatever : IWhatever<ConcreteWhatever>
{
    public List<ConcreteWhatever> Foo(ConcreteWhatever BarObject = default(ConcreteWhatever))
    {
        return null; // replace with proper code
    }
}