Я пишу библиотеку для личного пользования, чтобы быстрее и удобнее создавать другие проекты. Большая часть библиотеки написана на VB.NET (упрощенная версия C#), но поскольку в VB.NET нет возможности для небезопасного кодирования, я написал небольшую часть на C# для обработки задач, требующих указателей. Почему я упоминаю библиотеку VB.NET, станет ясно позже в этом вопросе.
Один из статических классов в сопровождающей меня библиотеке C# — это относительно простая функция для преобразования между неуправляемыми структурами. Это выглядит следующим образом:
public static unsafe class SurroundingClass
{
public static T1 ValueToValueBitwise<T0, T1>(T0 Value)
where T0 : unmanaged
where T1 : unmanaged
{
if (sizeof(T0) != sizeof(T1)) throw new ArgumentException();
return *(T1*)&Value;
}
}
Я извиняюсь, если мой стиль кодирования нетрадиционен; Я самоучка.
Функция не генерирует ошибок компилятора в C# и великолепно работает при использовании другими функциями C#. Однако события развиваются не так гладко, когда я ссылаюсь на функцию из проекта VB.NET. Вот пример вызова моей функции в VB.NET:
Dim myInt As Integer = ValueToValueBitwise(Of Single, Integer)(13.5!)
Когда я пытаюсь скомпилировать эту функцию с помощью компилятора VB.NET, она терпит неудачу, предоставляя довольно неинформативное оправдание "'' является неподдерживаемым типом". Обычно, когда я получаю такого рода ошибку "''недопустимо", это происходит потому, что я не указал имя или параметр типа для объявления или аргумента типа соответственно. Однако это явно не так, поскольку вызов эквивалентной функции безупречно работает в C#. Когда вы наводите курсор на имя функции, Visual Studio отображает всплывающее окно с синтаксисом для вызова функции. Интересно, что когда я навожу курсор на имя функции, появляется следующее: Всплывающее окно Visual Studio
В настоящее время мое лучшее предположение состоит в том, что VB.NET не имеет эквивалента ключевому слову C# «unmanaged», и в результате компилятор VB.NET умирает жалкой смертью. Я ищу либо патч, обходной путь, либо какое-то другое решение. Я использую Visual Studio 2022 версии 17.6.3 с платформой .NET в обоих проектах, установленной на версию 4.8. Будем очень благодарны любой помощи. Спасибо!
Вот старая проблема 2018 года, в которой говорится, что мы не поддерживаем неуправляемые типы в Visual Basic, даже если тип используется в C#: Невозможно вызвать метод C# 7.3 с параметром неуправляемого типа #300.
learn.microsoft.com/en-us/dotnet/api/…
VB .Net ни при каких обстоятельствах не разрешает код unsafe. см. Как я могу использовать небезопасный код в VB.Net?





Как объяснил пользователь dbc, VB.NET не поддерживает неуправляемые типы. В результате типы не соответствовали требованиям, так как они должны были наследовать от типа, не существовавшего в VB.NET. Это заставляло компилятор выдавать ошибку при попытке компиляции.
Спасибо за помощь!
Я не знаю, что происходит с кодом vb.net, но подозреваю, что Unsafe.As<TFrom,TTo>(TFrom) может делать то, что вам нужно.