【问题标题】:Generics compile error in C# (but works in VB.NET)C# 中的泛型编译错误(但在 VB.NET 中有效)
【发布时间】:2014-04-04 15:28:04
【问题描述】:

我对泛型有一个奇怪的问题。我收到以下编译错误:

最好的重载方法匹配有一些无效参数

参数“1”:无法从“EntityBase”转换为“T”

错误在EntityWrapper.DoSomethingElse,见下:

public abstract class EntityBase
{
    public static bool DoSomething<T>(T entity, string someArg) where T : EntityBase
    {
        // implementation doesn't matter
        return true;
    }
}

public class EntityWrapper<T> where T : EntityBase
{
    private EntityBase _entity;

    public void DoSomethingElse()
    {

        EntityBase.DoSomething<T>(_entity, "some arg"); // <--- error here ---
    }

}

我有这个代码的 VB.NET 版本,可以很好地编译和执行,所以我希望它可以在 C# 中工作。

我在这里错过了什么?

最后,虽然没关系,但这是VS2008,.NET 3.5。

【问题讨论】:

  • 您的 VB.NET 版本是否启用了 Option Strict?
  • 我认为是,这是我用于其他项目的默认设置。但现在我开始怀疑......

标签: c# .net vb.net generics compiler-errors


【解决方案1】:

让我告诉你为什么你的代码无效:假设我创建了一个EntityWrapper&lt;MyEntity&gt;,其中MyEntity 派生自BaseEntity

var myWrapper = new EntityWrapper<MyEntity>();

EntityWrapper 内部发生了什么?这个:

EntityBase.DoSomething<T>(_entity, "some arg");

变成

EntityBase.DoSomething<MyEntity>(_entity, "some arg");

这是无效的:DoSomething 期望 MyEntity 作为其第一个参数,但您传递了 BaseEntity。这就是错误Argument '1': cannot convert from 'EntityBase' to 'T' 的含义。


如何解决这个问题?在EntityWrapper中,声明_entity如下:

private T _entity;

这允许您将_entity 静态键入到BaseEntity 的具体子类型。

【讨论】:

  • 是的,我需要的是private T _entity;。虽然@JoelCoehoorn 的回答也是正确的,但正是在这里我错误地转换了旧代码。感谢大象的[盆栽。
【解决方案2】:

只需省略&lt;T&gt;。类型推断会弄明白的:

EntityBase.DoSomething(_entity, "some arg"); 

【讨论】:

    【解决方案3】:

    也许你可以这样调用方法:

    EntityBase.DoSomething<EntityBase>(_entity, "some arg");
    

    编译器无法将_entity(即EntityBase)转换为T(在方法调用中指定)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多