【问题标题】:Structs in C# (type could not be found)C# 中的结构(找不到类型)
【发布时间】:2010-02-03 17:20:48
【问题描述】:

我是 C# 新手,所以请原谅这个愚蠢的问题。我正在玩一个简单的 XNA 游戏演示。我有一个结构,我希望它可用于多个类。定义如下:

PhotonType.cs

using System;

namespace ShipDemo
{
 public struct PhotonType {
        public Color tint;
 }
}

在同一文件夹/命名空间中的另一个文件 Ship.cs 中,我引用了这个结构:

namespace ShipDemo {
    public class Ship {
    //...
       private PhotonType photonType;
       //...
       public Ship(float x, float y, float ang, Boolean correctSound, PhotonType photonType) {
    //...
  }
}

这给了我对 PhotonType 的两个引用的编译错误。

错误 1 ​​类型或命名空间名称 找不到“PhotonType”(是 您缺少 using 指令或 部件 参考?)

我在这里做错了什么?

////

另外,C# 文档说

初始化一个错误 结构中的实例字段。

但是如果我想提供默认值呢?

我正在使用 Visual Studio Ultimate 2010 Beta。

【问题讨论】:

  • @Rosarch:我已经为你的问题的最后部分提供了各种各样的答案。
  • 我支持你。谢谢。

标签: c# struct xna


【解决方案1】:

这两个文件在同一个项目中吗?如果您的命名空间被拆分为 2 个项目,则需要在另一个项目中引用包含 PhotonType 的项目。

如果是这种情况,我会质疑设计,因为通常我们不会将同一个命名空间拆分到多个程序集中。

【讨论】:

  • 看起来他们不是,实际上,但那是我无意的。如何将新文件添加到项目中?如果它最初不在项目中,我是否错误地创建了它?我刚刚选择了 File >> New >> File >> Visual C# Class
  • 弄清楚如何添加现有文件:右键单击项目名称,添加 >> 现有项目
  • 您也可以在项目之间拖动文件或在文件系统中移动它们点击Show all Files按钮然后Include文件进入项目。 (当您想一次移动多个班级时,这很方便)
  • @rosarch 如果您在同一解决方案中的程序集之间共享类型,则不应在项目之间复制粘贴它们。您应该将它们放在一个项目中,然后添加对该项目的引用,以便在其他地方使用该类型。在不同的项目中定义相同的类型会导致代码中出现奇怪的错误。
  • @Will 我不确定 Rosarch 是否在 2 个程序集之间共享文件,而是创建了文件而不将其包含到项目中。记得他说他是 C# 的新手。如果他确实分享了文件,那么您的评论确实是真的。
【解决方案2】:

您的假设不正确。不要再做假设了。

  1. 确保您已经编译并且正在使用您的程序集的最新编译版本
    • 清理您的解决方案。重新编译您的解决方案。再次测试。
  2. 如果ShipPhotonType 在两个不同的程序集中(即项目)
    • 清理并重新编译。
    • 确保包含Ship 的程序集引用包含PhotonTypePROJECT
      • 引用另一个项目的DLL而不是项目的DLL是一个常见的错误
      • 这会导致您引用项目的旧版本而不是最新版本
      • 删除对PhotonType dll 的任何引用并重新添加对其PROJECT
      • 的引用
  3. 如果它们在同一个解决方案中
    • 清理并重新编译。
    • 确保PhotonType 文件已编译
      • 在项目浏览器中右击PhotonType.cs并选择属性
      • 构建操作应该是Compile
  4. 如果您仍然遇到此问题,您的项目可能会搞砸
    • 可能有noobitis。刚开始时,我们都经历过。
    • 创建新解决方案,向其中添加新项目,并为ShipPhotonType 添加新项目
    • 查看是否一切编译正确。将此新解决方案与旧解决方案进行比较,看看有什么不同

您可能在此过程中做了一些奇怪的事情。如果没有看到您的项目,很难准确地说出什么。如果这些都不起作用,我建议压缩您的项目并将其上传到某个地方。查看项目可能需要一分钟时间才能发现问题所在。

【讨论】:

    【解决方案3】:

    您是否包含了包含 PhotonType 的命名空间?例如通过“使用”

    using MyNamespace.MyLibThatContainsPhotonType;
    

    【讨论】:

    • 两个文件在同一个命名空间中。
    【解决方案4】:

    Re:你问题的最后一部分:如果你想要你的结构的默认值,我认为(有点)标准方法是创建一个静态只读变量,称为 Default 之类的东西,它将用这些值初始化你要。静态只读变量可以在类或结构的静态构造函数中初始化。

    public struct PhotonType {
        public static readonly PhotonType Default;
    
        public Color tint;
    
        static PhotonType() {
            // from here on out, PhotonType values initialized to PhotonType.Default
            // will have their tint set to Color.White
            Default = new PhotonType();
            Default.tint = Color.White;
        }
    }
    

    然后要获得默认值,您只需这样做:

    PhotonType pt = PhotonType.Default;
    

    【讨论】:

      【解决方案5】:

      听起来你需要

      using ShipDemo;
      

      在 Ship.cs 文件的顶部。 或者确保您的 Ship 类被包装在 ShipDemo 命名空间中:

      namespace ShipDemo
      {
          public class Ship
          {
              //...
          }
      }
      

      要么这样,要么我们需要您发布更多代码供我们查看。

      【讨论】:

      • 它们都在同一个 ShipDemo 命名空间中。
      【解决方案6】:

      如果这部分是多目标 XNA 项目 (Windows/XBox/Zune)... 如果是这样,则其中一个文件可能不包含在项目中。如果不是这种情况,您可能需要仔细检查PhotonType.csBuild ACtion 是否设置为Compile(这是您单击Solution Explorer 中的文件后的Properties 窗格之一

      【讨论】:

        【解决方案7】:

        提示在您收到的错误消息中。

        ...缺少 using 指令...

        using $Namespace$.ShipDemo 添加到要在其中使用 PhotonType 类型的代码顶部。

        编辑:

        两个文件都在同一个命名空间中。

        在您的示例代码中,您在两个示例中都提到了namespace ShipDemo ...。假设您使用不同的文件,这将比它的价值更麻烦。

        试试下面的。

        PhotonType.cs

         using System;
        
         namespace ShipUtils
         {
              public struct PhotonType
              {
                   public Color tint;
              }
         }
        

        Ship.cs

          using ******.ShipUtils;
        
          public class Ship
          {
               private PhotonType photonType;
               public Ship(float x, float y, float ang, Boolean correctSound, PhotonType photonType)
          }
        

        【讨论】:

          【解决方案8】:

          虽然 Dan 对如何提供默认值有一个很好的解决方案,但事实是,如果您想提供默认值,那么您应该使用类而不是结构。

          结构是一组没有“智能”的数据,而类是知道如何处理这些数据的数据组。

          听起来你想给我上课。

          【讨论】:

          • 结构可以具有智能,只是它们存在于堆栈中并且是值类型而不是引用类型,因此如果您开始添加智能它们会变得很大并且您可能希望它们在堆上,例如班级msdn.microsoft.com/en-us/library/ah19swz4.aspx
          猜你喜欢
          • 1970-01-01
          • 2020-08-28
          • 2022-01-09
          • 1970-01-01
          • 1970-01-01
          • 2012-09-10
          • 2014-11-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多