Почему компилятор говорит, что я пытаюсь преобразовать метод из void?

#c# #methods #interface

Вопрос:

Я пытался понять, как работают интерфейсы, но не смог этого сделать. Моя цель-написать «n» для WriteNorM() в классе writeN и написать «m» для WriteNorM() в классе writeM. Но когда я пытаюсь это сделать, это говорит о том, что «вы пытаетесь преобразовать пустоту в бул!» пожалуйста, помогите.(кстати, не обращайте внимания на названия классов, это всего лишь тестовая программа)

 class xd
{
    interface Ixd
    {
        void WriteNorM();
    }

    class writeN : Ixd
    {
        public void WriteNorM()
        {
            Console.WriteLine("n");
        }
    }

    class writeM: Ixd
    {
        public void WriteNorM()
        {
            Console.WriteLine("m");
        }
    }

    static void Main()
    {
        Ixd D = new writeN();
        Ixd D1 = new writeM();
       
        Console.WriteLine(D.WriteNorM());
        Console.WriteLine(D1.WriteNorM());
    }
}
 

Ответ №1:

Console.WriteLine ожидает аргумента, но WriteNorM определяется как

 void WriteNorM();
 

таким образом, он ничего не возвращает, и вы не можете перейти void к методу.

Концептуально void метод ничего не возвращает, поэтому нет возвращаемого значения для передачи в другой метод, как вы пытаетесь сделать:

 Console.WriteLine(D.WriteNorM());  //  is the same as Console.WriteLine(void)
                  ^^^^^^^^^^^^^
                       void
 

Изменение вашего кода на

 static void Main()
{
    Ixd D = new writeN();
    Ixd D1 = new writeM();
   
    D.WriteNorM();
    D1.WriteNorM();
}
 

произведет результат, который вы хотите:

 n
m
 

В качестве альтернативы вы можете изменить свой интерфейс, чтобы иметь

 string GetNorM();
 

вместо этого (т. Е. GetNorM Теперь возвращает string значение , в которое вы затем можете перейти Console.WriteLine , вместо void ):

 class xd
{
    interface Ixd
    {
        string GetNorM();
    }

    class writeN : Ixd
    {
        public string GetNorM()
        {
            return "n";
        }
    }

    class writeM: Ixd
    {
        public string GetNorM()
        {
            return "m";
        }
    }

    static void Main()
    {
        Ixd D = new writeN();
        Ixd D1 = new writeM();
       
        Console.WriteLine(D.GetNorM());
        Console.WriteLine(D1.GetNorM());
    }
}
 

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

1. Не «устранит проблему и вернется «. Он будет «Выдавать консольный вывод». Незнание разницы-это то, что заставило ОП задать этот вопрос в первую очередь.

2. @BenVoigt — очень хороший момент — » работа » — слабое слово в этой ситуации.