Трудности с передачей параметров конструктора

#c# #class #argument-passing

#c# #класс #передача аргументов

Вопрос:

Это назначение для класса.

Вот мой код на данный момент.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Proj03
{
    class MyClass
    {
        public string MyClass(bool First, int Last)
        {

            if (First == true)
            {
                return "FirstName";
            }

            else if (Last == 3)
            {
                return "LastName";
            }

        }


    }

    class Program
    {
        static void Main(string[] args)
        {
            bool var1 = true;
            int var2 = 3;
            Console.WriteLine(new MyClass(var1)); //Line 34
            Console.WriteLine(new MyClass(var2)); //Line 35
            Console.WriteLine("Press any key to terminate.");
            Console.ReadKey();
        }//end main
    }//end class Program
}//end namespace
 

Проблема, с которой я сталкиваюсь, двоякая:

Во-первых, ошибка в строках 34 и 35 продолжает указывать на то, что в «MyClass» нет конструктора, который принимает один аргумент. Итак, легко сделать вывод, что, вау, мне нужен конструктор, который может принимать один аргумент в классе. Я могу сделать конструктор просто отлично, но сложность заключается в передаче «var1» и «var2». Я считаю, что мне нужно передать по ссылке здесь.

Во-вторых, я считаю, что мне нужно принять во внимание тот факт, что «var1» и «var2» — это разные типы переменных. Я действительно не знаю, что с этим делать. Но главный вопрос этого поста заключается в выяснении первой проблемы.

Ограничение, наложенное на нас инструктором, заключается в том, что нам не разрешается ничего изменять в классе «Program».

Требуемый результат выглядит следующим образом:

Покажите свое имя здесь Покажите свою фамилию здесь Нажмите любую клавишу для завершения.

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

1. public string MyClass(bool First, int Last) : Конструктор не возвращает значение, так что это не конструктор… И даже как метод, что произойдет, если First = false и Last = 42?

2. Вы можете создать два конструктора, один из которых принимает bool, а другой — int.

3. И, если Программа класса была написана вашим инструктором, тогда я буду беспокоиться за вас

4. Вам также нужно будет реализовать ToString что-либо значимое для вывода на консоль.

5. Ваш инструктор указал пример вывода на консоль?

Ответ №1:

Вы можете решить проблему с отсутствующим конструктором следующим образом:

     public MyClass(bool First)
    {
        // your code here
    }

    public MyClass(int Last)
    {
        // your code here
    }
 

Обратите внимание, что тип возвращаемого значения не указан, поскольку конструкторы не возвращают. Это позволит вашим вызовам конструктора успешно выполняться.

Ответ №2:

Я, вероятно, не должен этого делать, но, ну … это то, чего вы пытаетесь достичь?

 class MyClass
{
    private bool? _first;
    private int? _last;

    public MyClass(bool first)
    {
        _first = first;
    }

    public MyClass(int last)
    {
        _last = last;
    }

    public override string ToString()
    {
        if (_first != null)
            return "FirstName";

        if (_last != null)
            return "LastName";

        return String.Empty;
    }
}
 

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

1. Итак, когда «var1» передается в MyClass, тот факт, что подчеркивание last является int ? означает, что для него установлено значение null? (и, следовательно, приводит только к возврату «FirstName»)

2. Точно. An int? будет инициализирован как null . int? является синтаксическим сахаром для Nullable<int> , который представляет собой структуру со int Value свойством и bool HasValue свойством. _first != null переводится _first.HasValue компилятором. Но я только что понял, что, возможно, показал вам вещи, которые вы еще не изучили…

3. Проблема с вещами, которые я еще не изучил, заключается в том, что класс, который я сейчас посещаю, является для меня первым курсом C #, что это 9-недельный курс, и он онлайн (плохое планирование с моей стороны). Однако это не тот курс, который я беру для получения степени, а дополнительный курс, который, как я думал, будет больше касаться XNA 4.0, а не Microsoft visual C # (хотя мне тоже нравится C # (пока)).).

Ответ №3:

Проблема возникает из-за того, что у вас есть имя вашего класса и метод с одинаковым именем. Вы не можете этого сделать. Любые свойства или методы в вашем классе не должны вызываться так же, как ваш класс.

Ваша проблема с конструктором связана с вашим вызовом new MyClass(var1) . Вы не указали конструктор в своем классе. Это будет выглядеть примерно так:

 public class MyClass
{
    // This is a constructor that takes a parameter.
    public MyClass(string myString)
    {
    }

    // This is a constructor that takes 0 parameters.
    // This exists if you do not specifically declare a constructor.
    public MyClass()
    {
    }
}
 

Ответ №4:

То, что вы ищете здесь, называется перегрузкой конструктора. Вы должны создать один конструктор, который принимает a bool в качестве аргумента, а другой, который принимает an int .

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

Удачи.

Ответ №5:

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

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

1. Я не верю, что это возможно решить с помощью необязательных аргументов. В этом случае первые аргументы являются разными типами в двух вызовах. Необязательные аргументы могут отображаться только в конце списка параметров.

2. Кажется, я помню, что мог включать только необязательные аргументы — все еще удовлетворяя «Необязательные аргументы могут отображаться только в конце списка параметров». Мне интересно, определит ли он, какую переменную изменять по типу полученной переменной… Давненько не был на C # 🙂