c# - 为什么 C# 不支持通过引用传递的运算符重载?

标签 c# clr c++-cli operator-overloading command-line-interface

这是 CLR 限制还是语言设计决定?我尝试在 C++/CLI 中完成它,当然它在哪里工作,因为需要支持 native C++:

public ref class Test
    {
        public:
        static Test^ operator &( Test^ msg, int& i )
        {
            i = i + 1;

            return nullptr;
        } 
    };

然后查看编译器省略的输出:

public: static Test __gc* op_BitwiseAnd(Test __gc* msg, Int32 __gc** modopt(IsImplicitlyDereferenced __gc*) i)
{
    i[0] += 1;
    return 0;
}

我更进一步并尝试从 C# 项目中调用此运算符 - 当然我需要去 [不安全] 来做它(我需要指针):

Test t = new Test();
int i = 0;

unsafe
{
    t = t & &i;
} 

显然 CLR 的实现不是那么难吗?我真的很想念运算符重载中的引用传递,并且至少想了解一下为什么会丢失这个?

当我们需要在运算符重载中处理引用变量时,为什么 C# 不能隐藏不安全和指针背后的丑陋之处?即使我选择采用这种丑陋的解决方法,它也不会在 Silverlight 中工作,因为 Silverlight 不允许不安全的操作...

最佳答案

在 C# 中,您的变量永远不会被调用者更改,除非您明确地将它们作为引用传递(例如,int.TryParse(s, out i),您明确指定 out 关键字)。此功能允许重载运算符在未经您明确许可的情况下更改操作数的内容,从而使事情变得复杂。

例如,

public static MyStruct operator + (ref MyStruct left, ref MyStruct right) {
    left = new MyStruct(); // !!!!!!!!
    return something(left, right);
}

当您在 C# 中引用此类运算符时:

MyStruct x = new MyStruct();
MyStruct y = new MyStruct();
MyStruct z = x + y; // in C#, you never expect `x` to be changed.

关于c# - 为什么 C# 不支持通过引用传递的运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1654796/

相关文章:

c# - Xamarin.Forms Google API 使用身份提供者对用户进行身份验证

jvm - 为什么 CLR 会溢出 Int32.MaxValue -> Single -> Int32,而 JVM 不会?

.net - 已签名的 .net 程序集在加载时是否经过全面验证,以检查它们是否未被修改?

c# - 显式空检查与空合并运算符的编译器评估?

c++ - 如何从另一个类调用静态方法?

c# - 绑定(bind)不适用于在 XAML 中创建的 DependencyObject

c# - 求值表达式 通用 C# 求值条件 多态性

c# - Javascript window.open() 转义符号

c# - 从 C#/.NET 调用 C++ 函数

c++ - 有没有办法在编译时实例化所有 C++ 模板大小?