Как я могу приблизиться к необнуляемым ссылочным типам в 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)

Другие вопросы по тегам