Как вернуть метод C#

#c# #operators

#c# #операторы

Вопрос:

Мне нужно вернуть метод в операторной функции.

         public int Add()
        {
            return 1;
        }
        public static int operator  ()
        {
            return Add;
        }
  

Мне нужно будет сделать это и для оператора / функции умножения, вычитания и деления.

Спасибо

Комментарии:

1. Вы хотите сказать, что вам нужно вернуть результат вызова метода? Или вернуть делегат метода?

2. Мне нужно вернуть возвращаемое значение Add()

3. Прекратите голосование! Это законный вопрос программирования, который относится к StackOverflow, независимо от того, насколько абсурдно фактическое намерение. Некоторые из лучших вопросов относятся к неясным или странным вещам в языке.

4. @DavidPfeffer: Я не думаю, что OP на самом деле должен делать здесь что-то странное — я подозреваю, что он просто неправильно понял или неправильно понял, что он должен делать.

5. Мне кажется, что он хочет , чтобы оператор использовал Add функцию (почти как если бы сам оператор был выражением, которое вычисляет функцию, затем операнды становятся аргументами). Почти как замена во время компиляции (или, возможно, во время выполнения).

Ответ №1:

Вы не можете объявлять операторы без параметров. Вы можете объявить оператор для возврата соответствующего делегата, например Func<int> , — но это было бы довольно странно, IMO.

Если вы можете рассказать нам больше о том, чего вы пытаетесь достичь, мы, вероятно, сможем помочь вам разработать более чистый дизайн.

Вот довольно странный пример перегрузки унарного оператора :

 using System;

class Weird
{
    private readonly int amount;

    public Weird(int amount)
    {
        this.amount = amount;
    }

    private int Add(int original)
    {
        return original   amount;
    }

    // Very strange. Please don't do this.
    public static Func<int, int> operator  (Weird weird)
    {
        return weird.Add;
    }
}

class Test
{
    static void Main(string[] args)
    {
        Weird weird = new Weird(2);
        Func<int, int> func =  weird;
        Console.WriteLine(func(3));
    }
}
  

РЕДАКТИРОВАТЬ: если вы просто пытаетесь реализовать Rational тип, вы, скорее всего, захотите:

 public struct Rational
{
    // Other members

    public Rational Add(Rational other)
    {
        ...
    }

    public static Rational operator  (Rational left, Rational right)
    {
        return left.Add(right);
    }
}
  

Комментарии:

1. мои глаза… очки ничего не делают … ;0)

2. «Реализуйте методы add, sub, multiply, divide, а также операторы» Это для проекта rational numbers.

3. @MaxWillmo: На самом деле этого недостаточно… зачем операторам нужно возвращать методы? Им будут предоставлены операнды, поэтому вы должны вернуть результат применения оператора к операндам…

Ответ №2:

Это то, что вы, кажется, пытаетесь сделать, но ваш пример затрудняет определение. Итак, из ваших комментариев в других ответах похоже, что вы хотите добавлять, вычитать, умножать, делить рациональные числа, что означает, что результат также должен быть рациональным (а не int).

Таким образом, вы могли бы определить каждый из ваших методов, а затем реализовать операторы для их вызова. Операторы всегда статичны, поэтому вам нужно будет проверять null и обрабатывать соответствующим образом (в этом случае я просто добавлю ArgumentNullException ):

 public class Rational
{
    public Rational Add(Rational other)
    {
        if (other == null) throw new ArgumentNullException("other");

        return // <-- return actual addition result here
    }

    public static Rational operator  (Rational left, Rational right)
    {
        if (left == null) throw new ArgumentNullException("left");

        return left.Add(right);
    }

    public Rational Subtract(Rational other)
    {
        if (other == null) throw new ArgumentNullException("other");

        return  // <-- return actual subtraction result here
    }

    public static Rational operator -(Rational left, Rational right)
    {
        if (left == null) throw new ArgumentNullException("left");

        return left.Subtract(right);
    }

    public Rational Multiply(Rational other)
    {
        if (other == null) throw new ArgumentNullException("other");

        return // <-- return actual multiplication result here
    }

    public static Rational operator *(Rational left, Rational right)
    {
        if (left == null) throw new ArgumentNullException("left");

        return left.Multiply(right);
    }

    public Rational Divide(Rational other)
    {
        if (other == null) throw new ArgumentNullException("other");

        return  // <-- return actual division result here
    }

    public static Rational operator /(Rational left, Rational right)
    {
        if (left == null) throw new ArgumentNullException("left");

        return left.Divide(right);
    }
}
  

Ответ №3:

Просто. Просто вызовите метод Add:

 return Add();
  

Комментарии:

1. Опечатка, это тоже не помогает.

2. Ему нужно выполнить оператор для производного объекта. Поскольку функция Add перегружает исходный результат оператора, он всегда будет равен 1.

Ответ №4:

Ответ №5:

Я не думаю, что вы можете перегрузить оператор для int! Вместо этого вам придется создать свой собственный класс-оболочку или структуру:

 public struct MyInt
{
    private int _value;

    public MyInt(int value)
    {
        _value = value;
    }

    public int Value
    {
        get { return _value; }
    }

    public static MyInt operator  (MyInt a, MyInt b)
    {
        return new MyInt(a._value   b._value);
    }

    public static implicit operator MyInt(int intValue)
    {
        return new MyInt(intValue);
    }

    public static explicit operator int(MyInt x)
    {
        return x.Value;
    }
}
  

Тогда вы можете делать с ‘ ‘ все, что захотите с ним сделать.

Неявный оператор автоматически преобразует int в myInt . Таким образом, вы могли бы назначить так: MyInt x = 7;

Явный оператор преобразует myInt в int, например: int i = (int)x; где x — это myInt .

Комментарии:

1. Вы также можете перегрузить оператор : public static MyInt operator (MyInt a) { return new MyInt(a._value 1); }