Определить универсальный объект, который реализует оператор + [duplicate]

8
задан Community 23 May 2017 в 11:54
поделиться

2 ответа

довольно часто запрашиваемая новая функция для C#: возможность указывать более общие ограничения параметров, чем те, которые у нас уже есть. Операторы являются одними из наиболее часто задаваемых вопросов. Однако C# в настоящее время не поддерживает это.

Возможные обходные пути:

  • Передайте делегат любому методу, который должен выполнять сложение. Это наиболее типобезопасный вариант, но, конечно, он раздражает, если вам нужно часто вызывать такой метод. Например:

     открытый класс Generic {
    public void DoSomething(T anItem, T AnotherItem, Func add) {
     // вместо
    Бла (предмет + другой предмет);
     // нужно написать:
    Бла (добавить (элемент, другой элемент));
     }
    }
    Generic genInt = ...;
    // и тогда вместо...
    genInt.DoSomething(1, 2);
    // нужно написать:
    genInt.DoSomething(1, 2, (a, b) => a + b);
     
  • Объявите свой собственный интерфейс IAdable. Затем вы можете использовать его как ограничение параметра универсального типа, но, очевидно, вы не можете использовать int в качестве параметра.Вам придется использовать собственную struct, содержащую только int и реализующую IAdable:

     public interface IAddable {
    T Добавить(T другое);
    }
    общедоступная структура Integer: IAddable {
    общедоступное значение;
    общественное целое (целое значение) { значение = значение; }
    public Integer Add (Integer other) { return new Integer (Value + other.Value); }
    }
    
    // тогда вместо
    Общий blah = ...;
    // нужно написать:
    Generic blah = ...;
     
  • динамический. Другой возможный обходной путь — использовать dynamic, но это довольно хакерский и совершенно небезопасный способ: он позволит передать любой тип и вызвать любой метод или оператор, и произойдет сбой только во время выполнения, а не при компиляции. -время.

8
ответ дан 5 December 2019 в 18:55
поделиться

В C# 4.0 появилось новое ключевое слово dynamic, позволяющее выполнять это во время выполнения. В предыдущих версиях это было возможно, но слишком сомнительно и сложно для меня. Но вы всегда можете передать делегата, который будет выполнять дополнения внутри дженерика. В противном случае это невозможно, потому что нет ISummable, IAdditive и, вообще говоря, нет способа узнать, является ли что-то аддитивным * во время компиляции. Если вам нужны дополнительные комментарии, я добавлю их позже. БР.

  • Я имею в виду, за исключением того, что вы владеете IAdditive и помечаете им некоторые типы, но это не будет работать, например, с целыми числами.
1
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: