无法将'MyClass'转换为'MyClass'

时间:2017-09-05 12:52:29

标签: c# linq

我正在尝试为单元测试目的创建一个Stub类。 Stub指向EXACT SAME EmployeeData类定义,但编译器认为它们是不同的,不知何故。因此,我不断收到以下消息:

  

无法隐式转换类型   'MeasurementContracts.Business.Services.EmployeeData'来   'EmployeeData工作'

  • “EmployeeData”
  • 没有其他定义
  • 由于某种原因,它“认为”有2个

会导致什么?

enter image description here

类似于:

namespace MeasurementContracts.Business.Services
{
    /// <summary>A data service model</summary>
    public class EmployeeData
    {
        public int EmployeeId { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string MiddleName { get; set; }

        public string EmailAddress { get; set; }

        public string KnownAs { get; set; }

        public string Login { get; set; }

        public string DomainName { get; set; }

        public string EmployeeStatusName { get; set; }

        public string WorkNumber { get; set; }

        public string SystemPersonType { get; set; }

        public string PersonType { get; set; }

        public string CellPhoneNumber { get; set; }

        public string OrganizationOrCostCenter { get; set; }

        public string OrganizationalLevel1Description { get; set; }

        public string PositionName { get; set; }

        public int SupervisorId { get; set; }

        public string GetName(bool useKnowAs = true)
        {
            if (useKnowAs && !string.IsNullOrWhiteSpace(this.KnownAs))
                return $"{this.KnownAs} {this.LastName}";

            return $"{this.FirstName} {this.LastName}";
        }

    }
}

STUB LOOKS LIKE:

namespace MeasurementContracts.UnitTests
{
    using OData.Client;
    using MeasurementContracts.Business.Services;
    using System;
    using System.Collections.Generic;
    using System.Linq;

    /// <summary>A proxy stub</summary>
    public class ODataProxyStub : ODataProxy
    {
        #region <Constructors>

        public ODataProxyStub()
        {
            Entities = new List<EmployeeData>();
        }

        #endregion

        #region <Properties>

        public List<EmployeeData> Entities { get; set; }

        #endregion

        #region <Properties>

        public override EmployeeData GetItem<EmployeeData>(string query)
        {
            // This is NOT working?
            return Entities.FirstOrDefault();
        }

        public override IEnumerable<EmployeeData> GetList<EmployeeData>(string query)
        {
            throw new NotImplementedException();
        }

        public override EmployeeData Post<EmployeeData>(string query, IEnumerable<object> parameters)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

PROXY BASE看起来像:

namespace OData.Client
{
    public class ODataProxy
    {
        protected readonly HttpClient Client;

        public ODataProxy();

        public string BaseUrl { get; set; }

        public virtual T GetItem<T>(string query);
        public virtual IEnumerable<T> GetList<T>(string query);
        public virtual T Post<T>(string query, IEnumerable<object> parameters);
    }
}

1 个答案:

答案 0 :(得分:4)

实际上它根本不是指同一个类。实际上,第二个EmployeeData并未引用任何类。这是通用名称。

您的ODataProxy定义了一种方法:

public virtual IEnumerable<T> GetList<T>(string query);

ODataProxyStub实现的使用:

public override IEnumerable<EmployeeData> GetList<EmployeeData>(string query)

{strong>不这是EmployeeData类型的专用版本(C#不支持),但您只需将T重命名为EmployeeData。< / p>

因此,编译器认为通用模板参数EmployeeData无法转换为具体类EmployeeData,这当然是正确的。

您可能想要的是:

class ODataProxy<T>
{
    public virtual IEnumerable<T> GetList(string query)
    {
    }
}

class ODataProxyStub : ODataProxy<EmployeeData>
{
    public override IEnumerable<EmployeeData> GetList(string query)
    {
    }
}

LINQpad重现问题的例子:

class Data
{
}

class Proxy
{
    public virtual T Get<T>()
    {
        return default(T);
    }
}

class Stub : Proxy
{
    private Data x = default(Data);

    public override Data Get<Data>()
    {
        return x;
    }
}
  

无法将类型'UserQuery.Data'隐式转换为'数据'