VB.net необходимо переопределить параметр из библиотеки С#

Я пытаюсь понять, как наследовать класс C# Sampler от OpenTelemetry.Trace в класс VB.net.

Когда я использую Visual Studio для автоматической реализации абстрактного класса, он предоставляет следующий код ниже, однако я не могу найти «IsReadOnlyAttribute» ни в одной dll для любой .net framework 4.6.2, которую использует наш проект.

Поиск в Интернете находит меня https://learn.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.isreadonlyattribute.-ctor?view=net-7.0&viewFallbackFrom=netframework-4.6.2 который показывает что этот атрибут существует в «System.Runtime.CompilerServices», который доступен в 4.7.1, 4.7.2, 4.8.

Есть ли другой способ сделать эту работу или мне нужно обновить наш проект?

Ваше здоровье

Imports OpenTelemetry.Trace
Public Class ConfigurableSampler
  Inherits Sampler

  Public Overrides Function ShouldSample(<IsReadOnlyAttribute> ByRef samplingParameters As SamplingParameters) As SamplingResult
    Throw New NotImplementedException()
  End Function 
End Class

Итак, сегодня я обновился до .Net framework 4.8, но все еще получаю сообщение об ошибке в VB.

Чтобы выяснить, было ли это связано с параметрами или модификатором «in», я добавил функцию, как показано ниже, которая показывает, что это работает, и проблема все еще связана с модификатором параметра «in».

Public Function Test(ByRef samplingParameters As SamplingParameters) As SamplingResult
    Return New SamplingResult(True)
End Function

Мне интересно, является ли это дефектом С# для VB или каким-то ограничением, с которым я сталкиваюсь.

Возможно, вам придется определить производный класс в проекте библиотеки C#, а затем сослаться на него в проекте VB. Тем не менее, я думаю, что таргетинг на .NET Framework 4.6.2 может ограничить версию языка C#, которую вы можете использовать, поэтому вы не сможете использовать in. В этом случае, возможно, вы можете настроить таргетинг на .NET Standard. Если OpenTelemetry.Trace использует in и поддерживает .NET Framework 4.6.2, то должен быть способ сделать это.

jmcilhinney 23.11.2022 08:17

Я только что попытался добавить эквивалент вашего класса в проект C#, ориентированный на .NET Framework 4.6.2, и он отлично работал с ключевым словом in. Вы должны либо перейти на более новую версию в своем текущем проекте - вы, вероятно, должны сделать это в любом случае, если нет особой причины не делать этого, - либо добавить библиотеку C# специально для этого типа.

jmcilhinney 23.11.2022 08:53

Ни у кого больше нет такой проблемы, немного странно. Вы застряли в vb.net, у него просто нет возможности правильно переопределить этот метод. Вы ничего не можете сделать, кроме как сделать это на С#. Возможно, это ошибка дизайна в библиотеке, я бы отправил отчет об ошибке.

Hans Passant 24.11.2022 00:37

Эй, @jmcilhinney, вы правы, лучший путь для меня здесь - создать класс адаптера C#, а затем сослаться на эту dll в проекте VB, спасибо. Создайте это как ответ, и я приму это. Ваше здоровье

Jaie 24.11.2022 01:04

привет @HansPassant, я регистрирую отчет здесь: developercommunity.visualstudio.com/t/…

Jaie 24.11.2022 01:07

Я рад, что вы добавили свой собственный ответ.

jmcilhinney 24.11.2022 01:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучший путь вперед, который я нашел здесь, заключался в том, чтобы создать следующий класс в проекте C#, а затем сослаться на него в проекте VB.net.

  public abstract class SamplerAdapter : Sampler
  {
    public override SamplingResult ShouldSample(in SamplingParameters samplingParameters)
    {
      return ShouldSampleAdapter(samplingParameters);
    }

    public abstract SamplingResult ShouldSampleAdapter(SamplingParameters samplingParameters);
  }

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