Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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
为什么可以';t泛型结构具有静态成员,这些成员在C#中指定泛型类型?_C#_Generics_Struct_Typeloadexception - Fatal编程技术网

为什么可以';t泛型结构具有静态成员,这些成员在C#中指定泛型类型?

为什么可以';t泛型结构具有静态成员,这些成员在C#中指定泛型类型?,c#,generics,struct,typeloadexception,C#,Generics,Struct,Typeloadexception,抱歉,如果这是重复的!我四处寻找,但找不到解释。当我尝试实例化这个结构时,下面的玩具示例给了我一个TypeLoadException。如果我使用一个类,或者不在静态成员中指定泛型类型(将其保留为T),那么它就可以正常工作 公共结构点 { 静态点IntOrigin=新点(0,0); tx{get;} T{get;} 公共点(T x,T y) { 这个.X=X; 这个。Y=Y; } } 我比较复杂的真实情况可以归结为这样的情况,所以我很想了解它为什么会发出TypeLoadException。,在G

抱歉,如果这是重复的!我四处寻找,但找不到解释。当我尝试实例化这个结构时,下面的玩具示例给了我一个TypeLoadException。如果我使用一个类,或者不在静态成员中指定泛型类型(将其保留为T),那么它就可以正常工作

公共结构点
{
静态点IntOrigin=新点(0,0);
tx{get;}
T{get;}
公共点(T x,T y)
{
这个.X=X;
这个。Y=Y;
}
}
我比较复杂的真实情况可以归结为这样的情况,所以我很想了解它为什么会发出TypeLoadException。

,在Github上,我最接近于解决当前的问题,指出了为什么不允许使用自引用结构定义,而且在可预见的未来可能不会

即使静态成员也需要先初始化类型,然后才能将其包含在类型布局中,但类型初始化需要初始化该静态成员。此初始化依赖项循环创建Catch-22,导致运行时异常

据介绍,.NET内核可以很好地使用这种模式。但是当我在一个.NET核心项目中尝试你的例子时,我发现了同样的失败。因此,要么该注释是错误的,要么实例成员场景和静态成员场景之间存在一些细微的差异(除此之外,我没有进一步调查)

有趣的是,dotNETFiddle.net上使用的编译器发出编译时错误。我不知道为什么Visual Studio编译器似乎不再产生此错误(在2017年和2019年检查)。对我来说,这似乎是另一个错误。但是围绕这个问题对Github的讨论似乎接受了这样一个事实:代码在技术上是有效的(即根据C#规范),因此可能在某个时候有意识地决定删除编译器错误,并让CLR在运行时进行投诉

请注意,错误参考页面中的建议建议更改为
,而不是
结构
。当然,在使用
struct
的情况下,这通常是不可行的;具有值类型可能很重要。然而,在您的具体示例中,实际上有一个基于该想法的简单变通方法。由于字段不是
结构的实例的实际布局的一部分,因此可以将其移动到专门用于此类值的静态类中。例如:

公共结构点
{
公共静态类常量
{
静态点IntOrigin=新点(0,0);
}
tx{get;}
T{get;}
公共点(T x,T y)
{
这个.X=X;
这个。Y=Y;
}
}

然后,您需要使用
Point.Constants.IntOrigin
,而不是(例如)
Point.IntOrigin
。由于每个类型的类型初始化都可以独立完成,因此不会出现初始化循环,代码运行正常。

。我可以用Mono和.NET Core重现您的错误。但是,在dotnetfiddle.NET上使用“.NET Framework”选项时,会出现编译器错误。。。如果我。。。不要在静态成员中指定泛型类型-我不理解;给出的玩具示例在静态成员中不使用t,那么它是否给出了异常?你能检查一下你的问题是否准确吗?这似乎自相矛盾。你能分享引发异常的代码吗?我发现了多个与此相关的问题。看起来像是CLR错误。@Sweeper:这些Github问题看起来确实相关,但情况并不完全相同。这就是说,这表明这种行为早已为人所知。奇怪的是,dotnetfiddle.net会发出编译器错误;我没有一个旧版本的VS来测试,但是我猜五年前(基于CS0523文档页面的日期),你会得到一个编译时错误而不是运行时错误。也许有人认为这在技术上不是一个代码错误,所以编译器不应该禁止它(即在Roslyn中更改)。
public struct Point<T>
{
    static Point<int> IntOrigin = new Point<int>(0, 0);

    T X { get; }
    T Y { get; }

    public Point(T x, T y)
    {
        this.X = x;
        this.Y = y;
    }
}