Как я могу приблизиться к необнуляемым ссылочным типам в C# сегодня?
Я прочитал много не обнуляемых вопросов и ответов. Похоже, лучший способ приблизиться к ненулевым типам в C# (4.0) - взломать JN Skeet NonNullable<>;;.
Однако, похоже, что C++/CLI решил большую часть проблемы, поддерживая управляемые ссылки: Foo%
(вместо родного C++ Foo&
). Компилятор делает эту работу, добавляя modreq(IsImplicitlyDereferenced)
к аргументу. Попытка вызвать такую функцию из C# приводит к:
'<FunctionName>' is not supported by the language
Есть ли что-нибудь лучше, чем NonNullable<>?
Есть ли способ (разумно - т.е. без отражения) вызвать метод C++/CLI Foo::Method(Bar%)
из C#?
[edit] Кажется, в настоящее время нет ничего лучше, чем NonNullable<>... Хотелось бы получить некоторые комментарии по поводу C++/CLI, поскольку у него уже есть хотя бы частичное решение.
2 ответа
Я сталкивался с этим несколько раз... Я еще не нашел ничего лучше, чем решение Скита. Решены все дела, с которыми я столкнулся, поэтому я должен отдать свой голос.
Я согласен, что это немного странная ситуация, когда мы должны прибегнуть к этому... но его решение действительно решает проблему.
Да, speC#: http://research.microsoft.com/en-us/projects/specsharp/
- Изменить: я только что заметил, что вы сказали C# 4.0; Я уверен, что SpeC# не поддерживает эту версию. Тем не менее, обзор стоит того.
Вы также можете (я думаю) проверить на более позднем этапе, а затем скомпилировать, используя правило в Жандарме: http://www.mono-project.com/Gendarme (при условии, что он работает с 4.0)