c#为什么必须将转换操作符声明为静态和公共

本文关键字:静态 声明 操作符 为什么 转换 | 更新日期: 2023-09-27 18:15:20

关于以下编译错误:

用户自定义操作符'Foo。隐式操作符Foo(Bar)'必须声明为static和public

这是什么原因?为什么用户定义的转换操作符必须是public ?

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

 internal class Bar{}
 internal class Foo
 {
     private Bar _myBar;
     internal static implicit operator Bar(Foo foo)
     {
          return foo._myBar;
     } 
 }

我检查了c#语言规范,相关章节(10.10.3)没有提到这个要求。这是编译器的事情,而不是c#/.Net限制?

为了让事情变得更奇怪,我可以让上面的转换运算符public,只要FooBar都是internal,这是奇怪的,因为我认为你不能在公共方法上返回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;
    }
}

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

c#为什么必须将转换操作符声明为静态和公共

中指定§10.10:

以下规则适用于所有操作符声明:

  • 操作符声明必须同时包含publicstatic修饰符。

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

在第二个代码片段中出现错误的原因是不能在公共类型的公共方法中返回内部类型。这些规则适用于任何方法,而不仅仅是操作符。

至于为什么语言设计者选择要求转换操作符是公共的……我想他们可能是想避免这些操作符有太多的"魔力"——也就是说,他们不希望代码在一个程序集中以一种方式运行,而在另一个程序集中以完全不同的方式运行,而没有任何明显的指示。记住,运算符只是语法糖。如果你想要一个只在程序集中可见的转换方法,只需定义ToBar()并自己调用它;不要依赖操作符