Можно ли объединить Generic Constraint с перегрузкой операторов? - PullRequest
0 голосов
/ 20 мая 2018

Интересно, можно ли с помощью Generic Constraint (когда) разрешить этот код?

И каков правильный шаблон для этого?

public MyClass<T>
{
    public void MyMethod(T a, T b) 
    {
       //some code
       var result = a<b;
      //some code 
    }
}

мой вопрос ко всемоператор вообще

+, -, !, ~, ++, --, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

В данный момент (май 2018 г.) единственное, что вы можете сделать, это добавить ограничение к IComparable<T> к определению класса и использовать метод CompareTo вместо <.

public class MyClass<T> where T : IComparable<T>
{
    public void MyMethod(T a, T b) 
    {
       //some code
       var result = a.CompareTo(b) < 0; // a < b
       //some code 
    }
}

Это будет охватывать <, <=, >, >= (и технически даже ==, но лучше использовать IEquatable<T>), для == Вы можете добавить ограничение к IEquatable<T> к определению класса и использовать метод Equals вместо ==!Equals вместо !=).

Для математических / побитовых операторов на данный момент нет надежды.В списке пожеланий C # всегда есть запросы на эту функцию, но они всегда откладываются.В C # 8.0 эта функция не будет присутствовать (вероятно).См. официальный список кандидатов .См. Общий код C # и оператор Plus для более старого вопроса по этому поводу.Обратите внимание, что данные решения не будут выдавать ошибки во время компиляции, если вы попытаетесь использовать несуществующий оператор, но будут давать эти ошибки во время выполнения.

0 голосов
/ 20 мая 2018

Это на самом деле не касается сопоставления с образцом.where (не when) в этом случае означает общие ограничения .И нет, невозможно ограничить оператора.

Вы можете вместо этого использовать пользовательский интерфейс, добавив к нему ограничение.

public class MyClass<T> where T: ICustomInterface

IComparable - хороший кандидат для оператора >, но он не подходит, если вы хотите, чтобы оператор был перегружен.

Кстати, F # позволяет вам иметь такое ограничение - оно называется Ограничения члена - с использованием Статически разрешенные параметры типа .Это позволяет вам добавить ограничение на любой тип члена или оператора.Но это не функция CLR, это возможно только из-за системы логического вывода типов.

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