Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 为什么必须将重载运算符声明为公共的?_C# 4.0_Operator Overloading - Fatal编程技术网

C# 4.0 为什么必须将重载运算符声明为公共的?

C# 4.0 为什么必须将重载运算符声明为公共的?,c#-4.0,operator-overloading,C# 4.0,Operator Overloading,我想重载类中的运算符,并使其私有,以便只能从类中使用它。 然而,当我试图编译时,我得到了错误消息“用户定义运算符…必须声明为静态和公共: 为什么它们必须公开?要回答你问题的一半,你可以看到埃里克·利珀特的博客文章 相反,当我们面对危机时,我们应该问自己的问题 潜在的语言特征是“是否有 “功能证明所有成本合理?”并且成本远远超过 只是设计、开发、测试的普通成本, 记录和维护一项功能。还有更微妙的成本, 例如,此功能是否会使更改类型更加困难 未来的推理算法?这会把我们带入一个世界吗 在那里,如果不

我想重载类中的运算符,并使其私有,以便只能从类中使用它。
然而,当我试图编译时,我得到了错误消息“用户定义运算符…必须声明为静态和公共:


为什么它们必须公开?

要回答你问题的一半,你可以看到埃里克·利珀特的博客文章

相反,当我们面对危机时,我们应该问自己的问题 潜在的语言特征是“是否有 “功能证明所有成本合理?”并且成本远远超过 只是设计、开发、测试的普通成本, 记录和维护一项功能。还有更微妙的成本, 例如,此功能是否会使更改类型更加困难 未来的推理算法?这会把我们带入一个世界吗 在那里,如果不引入反向,我们将无法进行更改 兼容性中断?等等

在这种特殊情况下,引人注目的好处很小 在C语言中有一个虚拟的重载操作符,你可以构建一个 非常容易从静态部件中取出。例如:

现在你有了它。所以,好处很小。但是成本很高 大型.C++风格的实例运算符很奇怪。例如,它们会中断 对称性。如果你定义一个运算符+,它接受一个C和一个int,那么 c+2是合法的,但2+c不是,这严重破坏了我们的直觉 加法运算符的行为

至于你问题的另一部分:为什么它们应该公开

我找不到任何真实的源代码,但在我看来,如果它们不是公共的,并且只能在类中使用,那么这可以使用一个简单的私有方法来完成,而不是重载操作符

你可以看到RB Whitaker的博客文章

所有运算符重载必须是公共的和静态的,这应该使 有意义,因为我们希望在整个过程中都能接触到操作员 程序,因为它属于整个类,而不是任何类 类的特定实例


要回答你问题的一半,你可以看到Eric Lippert的博客文章

相反,当我们面对危机时,我们应该问自己的问题 潜在的语言特征是“是否有 “功能证明所有成本合理?”并且成本远远超过 只是设计、开发、测试的普通成本, 记录和维护一项功能。还有更微妙的成本, 例如,此功能是否会使更改类型更加困难 未来的推理算法?这会把我们带入一个世界吗 在那里,如果不引入反向,我们将无法进行更改 兼容性中断?等等

在这种特殊情况下,引人注目的好处很小 在C语言中有一个虚拟的重载操作符,你可以构建一个 非常容易从静态部件中取出。例如:

现在你有了它。所以,好处很小。但是成本很高 大型.C++风格的实例运算符很奇怪。例如,它们会中断 对称性。如果你定义一个运算符+,它接受一个C和一个int,那么 c+2是合法的,但2+c不是,这严重破坏了我们的直觉 加法运算符的行为

至于你问题的另一部分:为什么它们应该公开

我找不到任何真实的源代码,但在我看来,如果它们不是公共的,并且只能在类中使用,那么这可以使用一个简单的私有方法来完成,而不是重载操作符

你可以看到RB Whitaker的博客文章

所有运算符重载必须是公共的和静态的,这应该使 有意义,因为我们希望在整个过程中都能接触到操作员 程序,因为它属于整个类,而不是任何类 类的特定实例


一个相关的问题是:如果你只想在课堂上使用它,为什么它必须是一个运算符?是的,这是一个明显的解决办法。但我想知道为什么我必须要做一个解决办法。使用实际运算符使数学方程看起来像数学方程。告诉你帖子和例子?我真的很有兴趣看看这是怎么回事只在类内部有用。本质上,我是以一种我不希望在外部可用的方式使用我的类-该类是一个旋转矩阵,不应该通过将它们相加或缩放等方式在外部进行更改。但是,要创建一些旋转矩阵,必须进行多次加法和乘法这个类的一个例子,本质上把它当作一个普通的,可操作的矩阵,而不写一个完整的其他类,所以它不可用的原因可能是因为它会允许糟糕的设计。一个相关的问题是:如果你只想在你的类中使用它,为什么它需要是一个操作符?是的,这是一个明显的解决方法。但是我想我想知道为什么我必须做一个变通方法。使用实际运算符使数学方程看起来像数学方程。请发布文章并举例说明?我真的很想看看这如何只在课堂上有用。本质上,我是以一种我不希望外部可用的方式使用我的课堂——课堂是一个旋转矩阵,应该是这样的不能通过将它们相加或缩放等方式进行外部更改。但是,要创建一些旋转矩阵,必须对该类进行多次加法和乘法,基本上将其视为正常的、可操作的矩阵,而无需编写整个其他类。因此,该类不可用的原因可能是:因为它会允许糟糕的设计是的,但内部运营商也可能很有趣。不要将推理局限于私人。这并不能回答问题。op问“为什么他们必须公开?”…+1@中间,没有理由
public class B {
    public static B operator+(B b1, B b2) { return b1.Add(b2); }
    protected virtual B Add(B b2) { // ...