C#-我们应该如何在接口中实现default(T)?

5
在接口中使用 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),这导致了编译错误。

我只能将default(T)替换为null,然后一切都好了。但是这太丑陋了。为什么会发生这种情况?


顺便说一句 - 这是一个(小的)重构错误 - 我在这里提交了反馈:https://connect.microsoft.com/VisualStudio/feedback/details/686094/implement-interface-refactoring-of-generic-interface-improperly-handles-optional-arguments-in-c - Reed Copsey
你不需要在 Foo 的定义中添加 public 修饰符。因为你的接口是公共的,所以 public 是隐含的。 - IAbstract
3个回答

9
在这种情况下,您没有T,因为ConcreteWherever不是通用类型。如果您想要的是default(ConcreteWhatever),那么您应该编写该代码。您只是在抱怨Visual Studio自动生成的代码吗?如果是这样,那是一个合理的投诉,但最好明确说明一下... (请注意,您在此处并未使用显式接口实现-否则它将被声明为IWhatever<ConcreteWhatever>.Foo。您也没有适当的隐式实现,否则它应该是公共的...)编辑:我刚刚尝试了相同的事情,并看到了相同的结果,除了该方法会变成public。看起来这只是Visual Studio的错误。我建议您为此创建一个Connect请求。但这是一个相对罕见的情况,我认为 - 创建指定可选参数的泛型接口,并使用类型参数的默认值作为值...

我在MVC中使用这个“布局”(如果你愿意这么称呼它)来进行模型的CRUD操作。所以对我来说,这是一个常见的问题。+1 谢谢。 - P.Brian.Mackey
1
FYI - 我认为这是一个相对较小的错误,但我在此处提交了关于此问题的反馈:https://connect.microsoft.com/VisualStudio/feedback/details/686094/implement-interface-refactoring-of-generic-interface-improperly-handles-optional-arguments-in-c - Reed Copsey
@Reed Copsey - 谢谢 Reed,你节省了我很多时间。 - P.Brian.Mackey
@Reed:已经添加了一条注释。 - Jon Skeet

2

这行代码不应该是:

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

be:

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

是的,这就是我的帖子的重点。这不是Visual Studio生成的内容。当你实现接口时,只有一个T - P.Brian.Mackey

0
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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接