Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法转换C#_C#_.net_Casting - Fatal编程技术网

无法转换C#

无法转换C#,c#,.net,casting,C#,.net,Casting,我的解决方案中有两个不同的项目 其中一个我有一个名为MyClass1的类,另一个我有MyClass2 除了名称以外,这些类在所有方面都是相同的 在一个项目中,我有一个对象列表。在运行时,列表中会充满MyClass1对象 我们铸造了一个物体 最后,我想将列表中的每个对象强制转换为MyClass2对象 当前,它抛出一个异常,表示无法将MyClass1类型的对象强制转换为MyClass2 我的代码: List<Object> _tempObjects = new List<Objec

我的解决方案中有两个不同的项目

其中一个我有一个名为MyClass1的类,另一个我有MyClass2 除了名称以外,这些类在所有方面都是相同的

在一个项目中,我有一个对象列表。在运行时,列表中会充满MyClass1对象 我们铸造了一个物体

最后,我想将列表中的每个对象强制转换为MyClass2对象

当前,它抛出一个异常,表示无法将MyClass1类型的对象强制转换为MyClass2

我的代码:

List<Object> _tempObjects = new List<Objects>();
foreach(Object myObjectInput in _tempObjects)
{
  MyClass2 temp = (MyClass2) myObjectInput; // here is where it dies
}

不能仅仅因为对象的实现相同就强制转换对象。它们必须从同一基类或同一接口继承,或者是彼此的子类(然后只能从子类强制转换到父类)

其中一个我有一个叫做MyClass1的类,另一个我有 MyClass2这些类除了名称之外,在所有方面都是相同的


但是
MyClass1
不是
MyClass2
MyClass2
不是
MyClass1
。你不能把一个抛给另一个。你需要绘制它们的地图。基本上,对于每个属性,设置从一个实例到另一个实例的值。

强制转换不能以这种方式工作。将(静态称为)
对象的对象
强制转换为其他类型时,它必须已经是该类型的实例,才能正常工作。也许你想从一个转换到另一个,例如

List<Object> _tempObjects = new List<Objects>();


更可能的是,您应该做的是让项目以.NET本机理解和支持的方式共享
MyClass
:将它放在两个项目都可以引用的项目中。如果一个项目应该参考另一个,那么就这样做;否则,请创建第三个项目作为库。

您尝试执行的操作是不可能的。尽管这些类的内容相同,但它们仍然是不同的类型

您可以做的是:

  • 创建一个包含这两种类型之间共享的所有内容的接口
  • 让您的两种类型实现该接口
  • 将对象从列表中取出时强制转换到此接口

    • 如果不实现显式(或隐式)强制转换运算符,就不能简单地将一种类型强制转换为另一种类型

      首先,我想问为什么你们有两个完全相同的类。但是,如果必须这样做,则必须声明一个到另一个的显式强制转换:

      public class Class1
      {
          public string Name { get; set; }
      
          public static explicit operator Class1(Class2 cls)
          {
              return new Class1 { Name = cls.Name };
          }
      }
      
      public class Class2
      {
          public string Name { get; set; }
      
          public static explicit operator Class2(Class1 cls)
          {
              return new Class2 { Name = cls.Name };
          }
      }
      
      除了名称以外,这些类在所有方面都是相同的

      没有。静态类型不是这样工作的。从直觉上看,这些类在实现上可能是相似的,但就编译器而言,它们是完全不同的。一个不能直接投射到另一个

      List<Object> _tempObjects = new List<Objects>();
      

      在实现显式强制转换运算符之前,不能强制转换这两个对象,即使它们具有相同的实现,或者类型是当前类型派生自/到的类型。这是一张在.NET中强制转换的备忘单,请看

      如果MyClass1和MyClass2是相似的,您可以引入一个接口(我们称之为IMyClass),让MyClass1和MyClass2实现所述接口,然后您的代码(在下面修改)将通过强制转换到共享接口来工作

      foreach(Object myObjectInput in _tempObjects)
      {
        IMyClass temp = (IMyClass) myObjectInput;
      }
      

      您试图做的是不可能的MyClass1是MyClass2的子类,或者反过来说?在“它死在这里”时会出现什么错误?类的名称使它们与编译器完全不同。在这种情况下,允许从一种类型转换到另一种类型的唯一方法是定义自己的自定义转换方法。这可以是隐式的,也可以是显式的。但您仍然无法从对象强制转换为其他类型,除非您定义了从对象强制转换。请使用接口或基(抽象)类。使用接口/类的类型定义列表,然后可以正常调用方法。查看接口是如何工作的。请注意,这些强制转换运算符要求编译器知道旧对象是该类型,而不仅仅是
      对象
      (就像询问者的代码一样)。如果他有(更合理的)
      列表,等等。这将是一个有效的答案。FWIW,我不喜欢cast操作符,除非在某些情况下,比如数字类型:除了我上一条评论中的限制之外,与静态方法相比,它们更不易被发现(没有智能感知),更容易在重构中出错,并且类型安全性更低(因为它们与几乎通用的casting共享语法)。我看到它建议它们与一个做同样事情的静态方法配对,这通常让我说,“我将使用静态方法,毕竟不需要转换。”对,这是假设OP有一个type@TimS.我不同意第二条评论。我发现它们在一个项目中很有用,其中某个类型是另一个类型的扩展,但两者之间没有继承关系。当您需要将一个类型转换为另一个类型时,cast操作符的存在是有意义的。Pract从理论上讲,它与静态
      Mapper.Map
      方法做的事情是一样的。是的,我理解静态方法。我想这是一个品味问题。
      List<Object> _tempObjects = new List<Objects>();
      
      List<MyClass1> _tempObjects = new List<MyClass1>();
      
      foreach(Object myObjectInput in _tempObjects)
      {
        IMyClass temp = (IMyClass) myObjectInput;
      }