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