Как избежать бокса от выходного параметра типа значения к интерфейсу? - PullRequest
0 голосов
/ 25 марта 2020

При разработке я столкнулся с вопросом о боксе выходного параметра типа значения при реализации интерфейса. Как можно избежать создания внутри метода F интерфейса IProvider из экземпляра структуры S [X] в интерфейс IS?

Любая помощь будет принята с благодарностью.

interface IProvider
{
    bool F(out IS value); 
}

class ConcreteProvider1 : IProvider
{
    public bool F(out IS value)
    {
        value = new S1(1); // boxing S1 to IS
        return true; // some logic here
    }
}

class ConcreteProvider2 : IProvider
{
    public bool F(out IS value)
    {
        value = new S2("text"); // boxing S2 to IS
        return true; // some logic here
    }
}

interface IS { }
readonly struct S1 : IS
{
    public int Value1 { get; }
    public S1(int value) => Value1 = value;
}

readonly struct S2 : IS
{
    public string Value2 { get; }
    public S2(string value) => Value2 = value;
}

class Program
{
    static void Main(string[] args)
    {
        var result = new IProvider[] { new ConcreteProvider1(), new ConcreteProvider2() }
                            .Any(p => p.F(out var value));
    }
}

1 Ответ

0 голосов
/ 31 марта 2020

Возможно, мне следует использовать метод stati c. Попробуйте [X] с указанным типом значения c для выходного параметра

readonly struct S2 : IS
{
    public string Value2 { get; }
    public S2(string value) => Value2 = value;

    public static bool TryParse(out S2 s2)
    {
        s2 = new S2("text");
        return true;
    }
}

и вызовите методы stati c вместо использования Linq

var result = S2.TryParse(out var s2) || S1.TryParse(out var s1);

PS Весь код вопроса и ответа просто пример, чтобы более просто описать вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...