1

我有这个:

public IClub GetTeam()
{
    return new Arsenal();
}
//compiles since Arsenal is an IClub

public T GetTeam<T>() where T : IClub, new()
{
    return new Arsenal();
}
//wouldn't compile saying "cannot convert Arsenal to T"

但这些东西有效:

public T GetTeam<T>() where T : IClub, new()
{
    T t = new T();
    t.Sponsor = "Nike"; //since it knows T is IClub,
    return new T();     //but why the injustice to return type alone?
}
  1. 为什么即使返回类型仍然存在,第二个代码块也不会编译IClub?这不是不公平吗?

  2. 我知道我没有充分利用上述代码中类型约束的潜力,但是让代码运行的替代方法是什么?

4

2 回答 2

1

T 在编译时是一个未知类型,编译器无法知道它们是否可以从一种类型转换为另一种类型,因此您需要明确地调用该类型的转换。

return (T)(object)(new Arsenal());

这样,编译器就确定可以将阿森纳转换为对象,并且可以将该对象转换为 T。如果转换无效,您将获得运行时断言,但如果转换正确,它将编译并正常工作。

如果将 T 限制为 IClub,为什么 T 是未知的?因为任何类型都可以实现这个接口。您尝试返回阿森纳,但另一个类,假设“汽车:IClub”也实现了 IClub。在这种情况下,T 可以是 Car,但编译器无法证明阿森纳可以转换为 Car... 或任何其他类,因为它只知道它实现了哪个接口,而不是它的真实身份。

于 2012-10-18T06:21:11.230 回答
1

这是因为在编译时编译器不知道是否Arsenal可以转换为T. 毕竟T可能是另一种实现方式。IClub像在GetTeam<WhateverTeam>(). WhateverTeamimplements IClub,但你不能转换Arsenal成那个。

如果您希望代码编译(如 Marc-André 的回答),则必须转换结果,但您应该重新考虑您的设计(也调用GetTeam<WhateverTeam>()会导致异常)。如果您已经知道将返回哪种类型,那么将该方法设为通用是没有意义的。

于 2012-10-18T06:21:20.543 回答