这是 CLR 限制还是语言设计决定?我尝试在 C++/CLI 中执行此操作,当然它可以工作,因为需要支持本机 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# 不能隐藏 unsafe 和指针背后的丑陋?即使我选择使用这种丑陋的解决方法,它也无法在 Silverlight 中工作,不允许不安全的操作......