关于以下编译器错误:
用户定义的运算符 'Foo.implicit operator Foo(Bar)' 必须声明为静态和公共。
这是什么原因?为什么用户定义的转换运算符必须是 public
的?
考虑下面的代码,为什么这个转换不合法:
internal class Bar{}
internal class Foo
{
private Bar _myBar;
internal static implicit operator Bar(Foo foo)
{
return foo._myBar;
}
}
我查阅了C# Language Spec,相关章节(10.10.3)中没有提到这个要求。那是编译器的问题而不是C# / .Net的限制吗?
更奇怪的是,只要Foo
和Bar
都是internal
,我就可以把上面的转换操作符声明为public
,这很奇怪,因为我认为你不能在公共方法中返回一个internal
对象(尽管如果整个类是internal
,那无所谓)。然而,如果我创建一个public
的PublicFoo
并保持Bar
是internal
,那么我会得到一个“不一致的可访问性”编译器错误:
internal class Bar { }
internal class Foo
{
private Bar _myBar;
/// <summary>
/// No inconsistent accessibility: return type
/// </summary>
public static implicit operator Bar(Foo foo)
{
return foo._myBar;
}
}
public class PublicFoo
{
private Bar _myBar;
/// <summary>
/// Inconsistent accessibility: return type !!
/// </summary>
public static implicit operator Bar(PublicFoo foo)
{
return foo._myBar;
}
}
摘要
为什么用户定义的转换必须是公共的?