.Net 尝试分配时出现转换错误 CS0029 和 CS0266 class

.Net Conversion error CS0029 and CS0266 when trying to assign class

这个问题是我儿子提出来的,我无法准确回答。

当 converting/mapping 2 个相同的 classes 但在不同的命名空间中时,我们会收到错误消息。 我创建了 1 个 class Astronaut 并将 class 放在 2 个不同的命名空间中。

当您尝试分配 c = a 时出现此错误? 这是一个非常基本的示例,真正的问题发生在 2 classes 内部有多个 classes 并且为其编写映射器会很复杂。

郑重声明,我使用 Automapper 解决了这个问题,只是想知道这不起作用的真正原因。

using Apollo;
using Challenger;
void Main()
{
    var a = new Apollo.Astronaut();
    var b = new Challenger.Astronaut();
    // Cannot implicitely convert type 'Challenger.Astronaut' to 'Apollo.Astronaut'     
    var c = a;
        
    c = b; 
}

namespace Apollo{
    public class Astronaut
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    } 
}  

namespace Challenger{
     public class Astronaut
     {
         public string FirstName { get; set; }
         public string LastName { get; set; }
     }
 }

如果您需要两种不同的 Astronaut 类型,您需要定义一个基础 class 或制作一个它们都实现的接口。

基础class:

namespace Space
{
    public class Astronaut
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    } 
}

namespace Apollo
{
    public class Astronaut : Space.Astronaut
    {
    } 
}  

namespace Challenger
{
    public class Astronaut : Space.Astronaut
    {
    } 
}

void Main()
{
    Space.Astronaut a = new Apollo.Astronaut();
    Space.Astronaut b = new Challenger.Astronaut();
    var c = a;
    c = b; 
}

界面

namespace Space
{
    public interface IAstronaut
    {
        string FirstName { get; set; }
        string LastName { get; set; }
    } 
}

namespace Apollo
{
    public class Astronaut : Space.IAstronaut
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    } 
}  

namespace Challenger
{
     public class Astronaut : Space.IAstronaut
     {
         public string FirstName { get; set; }
         public string LastName { get; set; }
     }
}

void Main()
{
    IAstronaut a = new Apollo.Astronaut();
    IAstronaut b = new Challenger.Astronaut();
    var c = a;
    c = b; 
}

但我认为这不是正确的方法。无论任务如何,宇航员都是宇航员。所以你应该定义一个 Astronaut class 和一个 Mission class 来定义任务和执行任务的人。 顺便说一下,您并不是要“分配 class”。您正在尝试将一个 class 的实例分配给另一个实例。区分 classes 和 instances 非常重要。