为什么嵌套 class 中的隐式运算符方法无法编译?

Why does an implicit operator method in a nested class not compile?

这段代码报错:

public class A<T>
    {
        public class B<T1> : A<T1>
        {
            public static implicit operator bool(B<T1> b) => true;
        }
    }

但是如果我分开类,就没有错误:


  public class A<T> {     }

  public class B<T> : A<T>
  {
       public static implicit operator bool(B<T> b) => true;
  }

这是个很好的问题。我发现您可以通过指定 A<T>.B<T1>:

来消除错误
public static implicit operator bool(A<T>.B<T1> b) => true;

然后我开始想知道为什么在这个特定的实例中你需要限定内部 class,因为通常你不需要。

本质上,您所写的是一个隐式转换,它可以接受封闭类型以外的类型。请注意 A<int>.B<string>A<string>.B<string> 是不同的 classes.

让我们使用普通方法而不是隐式转换来更清楚地说明正在发生的事情。

public class A<T>
{
    public class B<T1>
    {
        public static void F(B<T1> i) {}
    }
}

请注意没有继承子句。暂时忍受我。这里的B<T1>其实就是A<T>.B<T1>的意思。这意味着我们不能这样做:

A<int>.B<string>.F(new A<string>.B<string>()); // cannot convert type ...

所以看起来只要在转换中写 B<T1> 就可以了。但是当你引入继承条款时...

public class A<T>
{
    public class B<T1>: A<T1>
    {
        public static void F(B<T1> i) {}
    }
}

A<int>.B<string>.F(new A<string>.B<string>()); // suddenly this compiles

这意味着您现在可以将 A<T>.B<T1> 以外的其他内容传递给隐式转换,这是不允许的。