此代码给出错误:
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;
因此,我开始想知道为什么在这种特殊情况下,您需要限定内部类,因为通常您不需要。
本质上,您编写的是一个隐式转换,可以接受封闭类型以外的类型。请注意,A<int>.B<string>
和A<string>.B<string>
是不同的类。
让我们使用普通方法而不是隐式转换来更清楚地说明正在发生的事情。
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>
以外的其他内容传递给隐式转换,这是不允许的。