Является ли это ограничением 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;
}
Я пошел дальше и попытался вызвать этот оператор из проекта С# - и, конечно, мне нужно было [небезопасно] сделать это (мне нужен был указатель):
Test t = new Test();
int i = 0;
unsafe
{
t = t & &i;
}
Очевидно, не так сложно реализовать для CLR? Мне очень не хватает передачи по ссылке при перегрузке операторов, и я хотел бы хотя бы осветить себя, почему этого нет?
Почему C# не может скрыть уродство за unsafe и указателями, когда нам нужно иметь дело со ссылочными переменными в наших перегрузках операторов? Даже если бы я выбрал этот уродливый обходной путь, он не сработал бы в Silverlight, где небезопасные операции запрещены...