无法将IEnumerable <t>的类型隐式转换为IEnumerable <t>

时间:2015-05-18 01:46:04

标签: c# generics

请考虑以下代码:

namespace TestNameSpace {
  public interface IFinder
  {
    IEnumerable<T> GetData<T>(DataStore dataStore);
  }

  public class EmployeeFinder : IFinder {
    public IEnumerable<Employee> GetData<Employee>(DataStore dataStore) {
        return dataStore.Employees; //*****This causes an error*****
    }
  }

  public class DataStore {
    public IEnumerable<Employee> Employees { get; set;}
  }

  public class Employee {

  }
}

我返回dataStore.Employees的行会导致编译错误。

  

无法隐式转换类型'System.Collections.Generic.IEnumerable&lt; TestNameSpace.Employee&gt;'到'System.Collections.Generic.IEnumerable&lt; Employee&gt;'。存在显式转换(您是否错过了演员?)

为什么当它们是同一类型时需要隐式转换?为什么一个名称空间而另一个不是?

谢谢!

2 个答案:

答案 0 :(得分:3)

您已使用Employee作为方法通用参数的名称,因此代码中的Employee有两种不同的含义。

namespace TestNameSpace {
  public interface IFinder
  {
    IEnumerable<T> GetData<T>(DataStore dataStore);
  }

  public class EmployeeFinder : IFinder {
    public IEnumerable<EmployeeGenericParameter> GetData<EmployeeGenericParameter>(DataStore dataStore) {
        return dataStore.Employees;
    }
  }

  public class DataStore {
    public IEnumerable<EmployeeClass> Employees { get; set;}
  }

  public class EmployeeClass {

  }
}

并且IEnumerable<EmployeeClass>无法转换为IEnumerable<EmployeeGenericParameter>,因为EmployeeGenericParameter可以是int或其他任何内容。

答案 1 :(得分:1)

您已创建了两种不同的Employee类型定义。一个作为普通类,另一个作为GetData方法的通用参数。

这很容易解决。只需将通用参数从GetData方法移动到IFinder接口本身即可。以下是您应该如何定义界面:

public interface IFinder<T>
{
    IEnumerable<T> GetData(DataStore dataStore);
}

现在EmployeeFinder如果按照以下方式实施,则可以正常工作:

public class EmployeeFinder : IFinder<Employee>
{
    public IEnumerable<Employee> GetData(DataStore dataStore)
    {
        return dataStore.Employees;
    }
}