【问题标题】:Why does an implicit operator method in a nested class not compile?为什么嵌套类中的隐式运算符方法无法编译?
【发布时间】:2020-04-14 02:27:46
【问题描述】:

此代码给出错误:

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;
  }

【问题讨论】:

  • 第二种情况你写的是public static implicit operator bool(B&lt;T&gt; b),而不是public static implicit operator bool(A&lt;T&gt; b)
  • 错误很明显。在第一个示例中,您有bool(A&lt;T&gt; b)。应该是bool(B&lt;T&gt; b)
  • 第二个代码 sn-p 中的隐式运算符具有不同的签名 - 它接受 B&lt;T&gt; 而不是 A&lt;T&gt;,因此两个代码 sn-ps 没有真正可比性。如果把参数类型改成A&lt;T&gt;那么也会报错。
  • @KevinGosse 我解决了这个问题
  • @Jimi,不,我编辑了问题,它不起作用

标签: c# generics inner-classes implicit


【解决方案1】:

这是一个很好的问题。我发现你可以通过指定A&lt;T&gt;.B&lt;T1&gt;来消除错误:

public static implicit operator bool(A<T>.B<T1> b) => true;

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

本质上,您编写的是一个隐式转换,它可以接受封闭类型以外的类型。请注意,A&lt;int&gt;.B&lt;string&gt;A&lt;string&gt;.B&lt;string&gt; 是不同的类。

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

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

注意没有继承子句。暂时忍受我。这里B&lt;T1&gt; 实际上是指A&lt;T&gt;.B&lt;T1&gt;。这意味着我们不能这样做:

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

所以看起来只是在转换中写B&lt;T1&gt; 就可以了。但是当你引入继承子句时……

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&lt;T&gt;.B&lt;T1&gt; 以外的其他内容传递给隐式转换,这是不允许的。

【讨论】:

  • 谢谢你的回答,我认为有编译技巧,但我不明白它是如何工作的
  • @EvgeniyTerekhin 你不明白什么?如果你澄清我也许能够解释。
  • 我不明白为什么编译器将“Foo”方法中的参数“i”绑定为A.B。为什么不是 A.B
  • i A&lt;T&gt;.B&lt;T1&gt;。我从来没有说过不是这样。 @EvgeniyTerekhin
  • 当我使用继承时,iA&lt;T1&gt;.B&lt;T1&gt;,没有继承时iA&lt;T&gt;.B&lt;T1&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2020-01-04
  • 2023-03-13
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多