具有协方差和将类更改为结构的特殊编译错误

问题描述

到目前为止,我发现我已经能够将类更改为结构体,但有以下注意事项:

  1. 结构不能从类继承,只能从接口继承。
  2. 结构具有价值示意图。
  3. 结构认初始化为它们的所有值,而类认初始化为空

但是一旦我了解了所有这些差异,对于小的只读类,这从未导致任何下游问题。

但是在我的一个课程中,我最近开始遇到编译错误。我把范围缩小到这个minimal example

using System;

public class Test
{
    private class A {}
    private class B : A {}

    private interface I<out T> {}

    private class C<T> : I<T> {}
    private struct S<T> : I<T> {}

    private static void F(I<A> _) {}
    private static void G(I<I<A>> _) {}

    public static void Main()
    {
        F(new C<B>());
        F(new S<B>());
        G(new C<C<B>>());
        G(new S<C<B>>());
        // G(new C<S<B>>()); // compile error
        // G(new S<S<B>>()); // compile error
    }   
}

似乎协方差适用于一个结构,结构只能有一层协方差,而类可以将它们的协方差嵌套到无限深。

我的问题是?

  1. 这是怎么回事?
  2. C# 规范中描述这一点的规则是什么?
  3. 有人可以用通俗的语言解释这条规则吗?
  4. 在创建结构时,我应该考虑这条规则的任何其他后果吗?

(如果你不能回答所有四个问题,没关系)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)