请考虑以下代码:
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;'。存在显式转换(您是否错过了演员?)
为什么当它们是同一类型时需要隐式转换?为什么一个名称空间而另一个不是?
谢谢!
答案 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;
}
}