Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Я столкнулся с этим несколько раз... Мне еще предстоит найти что-то лучшее, чем решение Skeet. Он решил все случаи, с которыми я столкнулся, поэтому я должен дать ему свой голос.

Я согласен с тем, что это хакерская ситуация, что мы должны прибегать к этому... но его исправление решает проблему.

Ответ 2

Yep, speС#: http://research.microsoft.com/en-us/projects/specsharp/

- Изменить: я просто заметил, что вы сказали С# 4.0; Я уверен, что SpeС# не поддерживает эту версию. Тем не менее, это заслуживает внимания.

Вы также можете (я думаю) проверить на более позднем этапе, а затем скомпилировать по правилу в жандарме: http://www.mono-project.com/Gendarme (при условии, что выполняется против 4.0)