Iva*_*nov 6 c# clr c++-cli operator-overloading command-line-interface
这是CLR限制还是语言设计决定?我尝试在C++/CLI中进行,当然它的工作原理是因为需要支持本机c ++:
public ref class Test
{
public:
static Test^ operator &( Test^ msg, int& i )
{
i = i + 1;
return nullptr;
}
};
Run Code Online (Sandbox Code Playgroud)
然后看了编译器省略的输出:
public: static Test __gc* op_BitwiseAnd(Test __gc* msg, Int32 __gc** modopt(IsImplicitlyDereferenced __gc*) i)
{
i[0] += 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我走得更远,试图从C#项目调用这个操作符 - 当然我需要[不安全]来做它(我需要指针):
Test t = new Test();
int i = 0;
unsafe
{
t = t & &i;
}
Run Code Online (Sandbox Code Playgroud)
CLR显然没那么难实现?我真的很想念运营商超载中的参考文献,并且至少想知道为什么这会丢失?
当我们需要在运算符重载中处理引用变量时,为什么C#不能隐藏不安全和指针背后的丑陋?即使我选择使用这种丑陋的解决方法,它也不适用于不允许不安全操作的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);
}
Run Code Online (Sandbox Code Playgroud)
当您在C#中引用此类运算符时:
MyStruct x = new MyStruct();
MyStruct y = new MyStruct();
MyStruct z = x + y; // in C#, you never expect `x` to be changed.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1984 次 |
| 最近记录: |