Я пытаюсь понять, как наследовать класс 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#, ориентированный на .NET Framework 4.6.2, и он отлично работал с ключевым словом in
. Вы должны либо перейти на более новую версию в своем текущем проекте - вы, вероятно, должны сделать это в любом случае, если нет особой причины не делать этого, - либо добавить библиотеку C# специально для этого типа.
Ни у кого больше нет такой проблемы, немного странно. Вы застряли в vb.net, у него просто нет возможности правильно переопределить этот метод. Вы ничего не можете сделать, кроме как сделать это на С#. Возможно, это ошибка дизайна в библиотеке, я бы отправил отчет об ошибке.
Эй, @jmcilhinney, вы правы, лучший путь для меня здесь - создать класс адаптера C#, а затем сослаться на эту dll в проекте VB, спасибо. Создайте это как ответ, и я приму это. Ваше здоровье
привет @HansPassant, я регистрирую отчет здесь: developercommunity.visualstudio.com/t/…
Я рад, что вы добавили свой собственный ответ.
Лучший путь вперед, который я нашел здесь, заключался в том, чтобы создать следующий класс в проекте C#, а затем сослаться на него в проекте VB.net.
public abstract class SamplerAdapter : Sampler
{
public override SamplingResult ShouldSample(in SamplingParameters samplingParameters)
{
return ShouldSampleAdapter(samplingParameters);
}
public abstract SamplingResult ShouldSampleAdapter(SamplingParameters samplingParameters);
}
Возможно, вам придется определить производный класс в проекте библиотеки C#, а затем сослаться на него в проекте VB. Тем не менее, я думаю, что таргетинг на .NET Framework 4.6.2 может ограничить версию языка C#, которую вы можете использовать, поэтому вы не сможете использовать
in
. В этом случае, возможно, вы можете настроить таргетинг на .NET Standard. Если OpenTelemetry.Trace используетin
и поддерживает .NET Framework 4.6.2, то должен быть способ сделать это.