Различить сигнатуры через contraints
От: Barbar1an Украина  
Дата: 17.01.25 13:57
Оценка:
Имеем

public static E Read<E>(this BinaryReader reader) where E : struct, System.Enum

public static T Read<T>(this BinaryReader r) where T : IBinarySerializable, new()


В итоге "error CS0111: Type 'Extentions' already defines a member called 'Read' with the same parameter types"

как разрулить чисто через contraints?

ЖПТ предложил много чего в том числе и не работающий
public static T Read<T>(this BinaryReader reader) where T : class, IBinarySerializable, new()
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Отредактировано 17.01.2025 13:58 Barbar1an . Предыдущая версия .
Re: Различить сигнатуры через contraints
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 17.01.25 14:54
Оценка: 5 (1) +2
Здравствуйте, Barbar1an, Вы писали:

B>как разрулить чисто через contraints?

На сколько я понимаю, никак:
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/basic-concepts#76-signatures-and-overloading

The signature of a method specifically does not include the return type, parameter names, type parameter names, type parameter constraints, the params or this parameter modifiers, nor whether parameters are required or optional.

Re: Различить сигнатуры через contraints
От: _NN_  
Дата: 19.01.25 11:25
Оценка: 250 (10)
Здравствуйте, Barbar1an, Вы писали:

B>как разрулить чисто через contraints?

В таком виде как есть никак, как уже ответили.

B>ЖПТ предложил много чего в том числе и не работающий

Жаль, а мог и предложить.

Есть вариант добавить параметр и тогда можно будет разрулить.
На ваше усмотрение подходит такой вариант или нет.

using System;
using System.IO;

public interface IBinarySerializable {}

public class Read<T> {}

public class RequireBinarySerializableNew<T> 
    where T : IBinarySerializable, new()
{}

public static class C
{
    // Тут для простоты не добавил.
    public static E Read<E>(this BinaryReader reader) where E : struct, System.Enum
    {
        Console.WriteLine("where E : struct, System.Enum");
        return new();
    }

    public static T Read<T>(this BinaryReader r, RequireBinarySerializableNew<T>? _ignore = null)
        where T : IBinarySerializable, new()
    {
        Console.WriteLine("where T : IBinarySerializable");
        return new();
    }
}

class ClassBinarySerializable : IBinarySerializable
{
    public ClassBinarySerializable() {}
}

enum TestEnum {}

class A{
    public static void Main() {
        var a = new BinaryReader(new MemoryStream());
        
        a.Read<TestEnum>();
        a.Read<ClassBinarySerializable>();
    }
}


https://dotnetfiddle.net/9yUkhn
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Различить сигнатуры через contraints
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.01.25 13:10
Оценка: +2 :)
Здравствуйте, _NN_, Вы писали:
_NN>Есть вариант добавить параметр и тогда можно будет разрулить.
Ах, шайтан!
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Различить сигнатуры через contraints
От: _NN_  
Дата: 21.01.25 21:05
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, _NN_, Вы писали:

_NN>>Есть вариант добавить параметр и тогда можно будет разрулить.
S>Ах, шайтан!


Честно признаюсь, мопед не мой.
Подсмотрел идею в StackOverflow.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Различить сигнатуры через contraints
От: Barbar1an Украина  
Дата: 24.01.25 15:08
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Есть вариант добавить параметр и тогда можно будет разрулить.


ыыыыыыыыы, гыыыыы)
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Различить сигнатуры через contraints
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.25 15:48
Оценка:
Здравствуйте, Barbar1an, Вы писали:

B>public static E Read<E>(this BinaryReader reader) where E : struct, System.Enum


Учти, что это не очень хорошая идея всегда ведущая к боксингу. System.Enum — это референсный тип. Переданное значение энума будет всегда бокситься, чтобы привестить к нему.

В 8-ом дотнете появилась возможность делать констрейн unmanaged. При этом с энумом можно работать как с числовым типом и не производится боксинга.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.