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)
,事情就好了。但这太可怕了。为什么会发生这种情况?
在本例中没有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
}
}