C#-将结构存储在同一类型的结构中

C#-将结构存储在同一类型的结构中,c#,struct,nested,C#,Struct,Nested,嗯 无法在同一类型的结构中存储结构实例。有人能帮我找到解决办法吗 我需要将vector3存储在vector3中,如下所示: public struct Vector3{ float x,y,z; Vector3 normalized; } 显然,它创造了一个无休止的循环,就像一个人创造了一个新的循环,创造了一个新的循环,等等 那么人们会怎么做呢?我需要将我的规范化为Vector3,因为它需要被识别为Vector3,并且不能是任何其他命名 最后,我知道这可以通过类来实现,但我不想这样

无法在同一类型的结构中存储结构实例。有人能帮我找到解决办法吗

我需要将vector3存储在vector3中,如下所示:

public struct Vector3{
   float x,y,z;
   Vector3 normalized;
}
显然,它创造了一个无休止的循环,就像一个人创造了一个新的循环,创造了一个新的循环,等等

那么人们会怎么做呢?我需要将我的规范化为Vector3,因为它需要被识别为Vector3,并且不能是任何其他命名

最后,我知道这可以通过类来实现,但我不想这样


谢谢

您不能将X类型的结构存储在X类型的结构中。但是,您可能无论如何都不想这样做,因为一般来说,结构(以及类)应该只存储它们需要完成的数据。相反,您可以使用一个函数构建并返回结构的“规范化”版本:

public struct Vector3
{
    float x,y,z;
    public Vector3 Normalized 
    { 
        get 
        { 
            ... build the normalized struct and return it ... 
        } 
    }
}

您不能将X类型的结构存储在X类型的结构中。但是,您可能无论如何都不想这样做,因为一般来说,结构(以及类)应该只存储它们需要完成的数据。相反,您可以使用一个函数构建并返回结构的“规范化”版本:

public struct Vector3
{
    float x,y,z;
    public Vector3 Normalized 
    { 
        get 
        { 
            ... build the normalized struct and return it ... 
        } 
    }
}

结构是一种值类型。声明递归结构将创建一个无限大的结构!一种解决方法是将其声明为类。但在这里,我只是将
规范化
声明为一个属性

public struct Vector3 {
    public Vector3(float x, float y, float z)
    {
        X = x;
        Y = y;
        Z = z;
    }

    public float X { get; private set; }
    public float Y { get; private set; }
    public float Z { get; private set; }

    public float Length {
        get { return (float)Math.Sqrt(X * X + Y * Y + Z * Z); }
    }

    Vector3 Normalized {
        get {
            float l = Length;
            return new Vector3(X / l, Y / l, Z / l);
        }
    }
}

结构是一种值类型。声明递归结构将创建一个无限大的结构!一种解决方法是将其声明为类。但在这里,我只是将
规范化
声明为一个属性

public struct Vector3 {
    public Vector3(float x, float y, float z)
    {
        X = x;
        Y = y;
        Z = z;
    }

    public float X { get; private set; }
    public float Y { get; private set; }
    public float Z { get; private set; }

    public float Length {
        get { return (float)Math.Sqrt(X * X + Y * Y + Z * Z); }
    }

    Vector3 Normalized {
        get {
            float l = Length;
            return new Vector3(X / l, Y / l, Z / l);
        }
    }
}

为什么命名不能改变?你真的不能像你坚持的那样做。您可以使用结构,但可能需要在类型命名/嵌套上让步。命名无法更改,因为规范化成员需要称为Vector3,或者无法将其传递给需要Vector3的方法。为什么命名不能更改?你真的不能像你坚持的那样做。您可以使用结构,但可能需要在类型命名/嵌套方面做出让步。命名无法更改,因为规范化成员需要被称为Vector3,或者无法将其传递给需要Vector3的方法。我本想使用该方法,但只是想知道这个问题。例如,我使用Unity引擎,他们有这种东西。您还可以看到,声明Vector3 vec后,最终得到vec.normalized.normalized.anyOtherMember;所以我想知道他们是如何做出这种行为的。我想就我的情况而言,我会走捷径。谢谢。这正是您通过实现所述的
规范化
属性而得到的行为。也就是说,它将返回一个
Vector3
,该Vector3还将具有一个
规范化的
属性。当然,vec.Normalized应该与vec.Normalized.Normalized相同,因此没有必要深入研究,但结构将是可用的。我曾想过使用该结构,但只是想知道这个问题。例如,我使用Unity引擎,他们有这种东西。您还可以看到,声明Vector3 vec后,最终得到vec.normalized.normalized.anyOtherMember;所以我想知道他们是如何做出这种行为的。我想就我的情况而言,我会走捷径。谢谢。这正是您通过实现所述的
规范化
属性而得到的行为。也就是说,它将返回一个
Vector3
,该Vector3还将具有一个
规范化的
属性。当然,vec.Normalized应该与vec.Normalized.Normalized相同,因此没有必要深入研究,但结构将可用。