C#为什么必须将转换运算符声明为static和public?

Phi*_*tle 6 .net c# type-conversion implicit-conversion

关于以下编译器错误:

用户定义的运算符'Foo.implicit operator Foo(Bar)'必须声明为static和public

这是什么原因?为什么必须使用用户定义的转换运算符public

提供以下代码,为什么这种转换不合法:

 internal class Bar{}

 internal class Foo
 {
     private Bar _myBar;

     internal static implicit operator Bar(Foo foo)
     {
          return foo._myBar;
     } 
 }
Run Code Online (Sandbox Code Playgroud)

我检查了C#语言规范,相关部分(10.10.3)没有提到这个要求.它是编译器而不是C#/ .Net限制吗?

为了使事情变得怪异,我可以作出上述转换操作符public,只要这两个FooBarinternal,这是奇怪的,因为我认为你不能返回internal上一个公共方法的对象(虽然我想,如果整个类是internal它止跌没问题.但是,如果我创建public PublicFoo并保持Bar internal然后我得到inconsistent accessibility编译器错误:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

摘要

为什么用户定义的转换必须公开?

p.s*_*w.g 5

在第10.10节规定:

以下规则适用于所有运算符声明:

  • 运算符声明必须同时包含publicstatic修饰符。

您在第一个代码段中未出现“不一致的可访问性”错误的原因与通常在内部类型上定义公共方法时未发生错误的原因相同。在内部类型上声明公共方法是完全有效的。

您在第二个片段得到一个错误的原因是因为它不是有效的在公共类型的公共方法返回一个内部类。这些规则不仅适用于运算符,还适用于任何方法。

关于语言设计者为何选择要求转换运算符公开的原因……我想他们可能想避免对这些运算符进行过多的“魔术”操作,也就是说,他们不希望代码在一个程序集内以一种方式起作用。并且在另一个程序集中使用完全不同的方式,而没有任何明显迹象表明正在发生什么。请记住,运算符只是语法糖。如果您想拥有仅在程序集中可见的转换方法,只需定义ToBar()并调用它即可;不要依赖运营商。