Переопределение виртуального метода

Сигнатура метода переопределения такая же, как и в исходном базовом классе System.Object, поскольку сигнатура включает только имя метода, а также типы и количество принимаемых параметров.

Почему необходимо иметь тот же тип возвращаемого значения для переопределения метода?

using System;

namespace Testing_Override_Keyword
{
    class OverridingClass
    {

        public override int ToString()//**Here is error**
        {
            return 1;
        }
    }
}

Это ошибка

Тип возвращаемого значения должен быть строковым, чтобы соответствовать переопределенному члену


person mdadil2019    schedule 05.06.2016    source источник
comment
Возможный дубликат C #: переопределение возвращаемых типов   -  person Mukesh Adhvaryu    schedule 05.06.2016


Ответы (2)


Почему необходимо иметь тот же тип возвращаемого значения для переопределения метода?

В некотором смысле, «потому что так говорится в спецификации языка». Из раздела спецификации C # 5 10.6.4:

Ошибка времени компиляции возникает, если для объявления переопределения не выполняются все следующие условия:

  • ...
  • Метод переопределения и переопределенный базовый метод имеют один и тот же возвращаемый тип.

В другом смысле, «потому что иначе это не имело бы смысла». Дело в том, что вызывающий должен иметь возможность вызывать виртуальный метод - в том числе с использованием возвращаемого значения - не заботясь о том, переопределен он или нет.

Представьте, если бы кто-то написал:

object x = new OverridingClass();
string y = x.ToString();

Как это будет работать с вашим переопределением?

person Jon Skeet    schedule 05.06.2016

Виртуальный метод ToString() возвращает string, но в вашем случае вы возвращаете int, который не является той же сигнатурой, поэтому у вас есть ошибка компиляции.

person George Findulov    schedule 05.06.2016
comment
Нет, возвращаемый тип не является частью подписи - это то, что сбивает с толку OP. (Они правы в этом, но тип возвращаемого значения должен совпадать так же, как и подпись.) - person Jon Skeet; 05.06.2016