不能隐含转换类型。存在显式转换

时间:2018-04-14 19:20:29

标签: c#

任何人都可以解释我为什么我会得到以下错误以及如何解决这个问题?这是我的代码:

    public enum DataSource
    {
        SqlServer,
        Csv,
        Oracle
    }

    public interface IRepo
    {
    }

    public interface IRepository<T> where T :class 
    {
         IEnumerable<T> GetRecords();
    }

    public static IRepo GetRepository(DataSource repositoryType)
    {
        IRepo repo;

        switch (repositoryType)
        {
            case DataSource.Csv:
                repo = new CsvRepository("path"); //perhaps path shoudln't br right passed right here - so where?
                break;

            case DataSource.SqlServer:
                repo = new SqlRepository();
                break;

            default:
                throw new ArgumentException("Invalid Repository Type");
        }

        return repo;
    }

public class CsvRepository : IRepository<InputData>
{

   private string _path;

   public CsvRepository(string path)
   {
       _path = path;
   }

   public IEnumerable<IBasic> GetRecords()
   {
       return from line in File.ReadLines(_path)
              select line.Split(',') into parts
              where parts.Length == 3
              select new InputData { Name = parts[0], X = Convert.ToInt32(parts[1]), Y = Convert.ToInt32(parts[2]) };
    }
}

//other repositories:
public class OracleRepository : IRepository<OtherDataType>
{
..
}
...

我在下面的行中出错:

 repo = new CsvRepository();
 repo = new SqlRepository();

错误:

  

无法隐式转换类型&#39; CsvRepository&#39;到&#39; IRepo&#39;。存在显式转换(您是否错过了演员?)。无法隐式转换类型&#39; SqlRepository&#39;到&#39; IRepo&#39;。存在显式转换(您是否错过了演员?)

加分问题(如果可能): 如你所见,我希望将文件的路径传递给CsvRepository的ctor - 如果我使用Factory模式,我确信不应该从我的工厂方法中传递,如何正确地执行它。同样对于SqlRepository我可能需要传递一些信息......

1 个答案:

答案 0 :(得分:1)

这里的根本问题是你的IRepository<T>不是从IRepo继承的,所以你可以这样写:

 IRepository<InputData> repo = new CsvRepository();

但不是:

IRepo repo = new CsvRepository();

为此你需要从IRepository<T>继承你的IRepo,因为现在没有Repository类与该接口的关系。

所以你需要这样做:

public interface IRepository<T> : IRepo where T : class
{
    IEnumerable<T> GetRecords();
}

请参阅example fiddle。 希望它有所帮助。