Невозможно неявно преобразовать тип ‘string’ в ‘System.DateTime’ — с t

#c# #vb.net #vb.net-to-c#

#c# #vb.net #vb.net-to-c#

Вопрос:

Как показано ниже, ошибка возникает из-за того, что я считаю ошибкой при переводе с Visual Basic на C #. Я не знаю, является ли это неправильным / устаревшим, связанным с VB, или какую «строку» я «конвертирую» в значения времени. Нужна помощь в том, должен ли я изменить структуру оператора if-then.

 using System;
using System.Media;
using System.Windows.Forms;

namespace NotificationDemo
{
    public partial class NotificationDemo : Form
    {
        public NotificationDemo()
        {
            InitializeComponent();
        }

        // Variables //

        public int hour;
        public int minute;

        // Messaging System //
        public void Alert(string msg)
        {
            NotifyForm frmn = new NotifyForm();
            frmn.showAlert(msg);
        }
        private void BtnNotify_Click(object sender, EventArgs e)
        {
            this.Alert("Default Message");

            SoundPlayer player = new SoundPlayer();
            player.SoundLocation = @"C:WindowsMediaAlarm03.wav";
            player.Play();
        }

        // Basic Schedule SysFunction 

        public string currenttime;
        public string messagetime;

        private void timer1_Tick(object sender, EventArgs e)
        {
            currenttime = DateTime.Now.ToString("hh:mm:ss tt");
            label1.Text = currenttime; 
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            messagetime = maskedTextBox1.Text   " "   comboBox1.Text;

            if (currenttime == messagetime)
            {
                timer2.Stop();
                this.Alert(textBox1.Text);
                button1.Enabled = true;
                button2.Enabled = false;

                SoundPlayer player = new SoundPlayer();
                player.SoundLocation = @"C:WindowsMediaAlarm03.wav";
                player.Play();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer2.Start();
            button1.Enabled = false;
            button2.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer2.Stop();
            button1.Enabled = true;
            button2.Enabled = false;

        }

        // Advanced Schedule SysFunction

        public ProgramFunctionsDataContext doAction = new ProgramFunctionsDataContext();


        private void NotificationDemo_Load(object sender, EventArgs e)
        {
            // // Basic Component

            int hour = 1;
            int minute = 1;

            for (this.hour = hour; hour <= 12; hour  )
            {
                cbhour.Items.Add(hour);
            }

            for (this.minute = minute; minute <= 59; minute  )
            {
                cbminute.Items.Add(minute);
            }

            // Appointment Check

            foreach (var app in doAction.AppointmentSets)
            {
///LINE OF ERROR
                if (app.AppointmentDate = DateTime.Today.ToLongDateString())
///LINE OF ERROR
                {
                    
                }
            }
        }
    }
}
 

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

1.Я предполагаю, что app.AppointmentDate является строковым значением. Если у вас не включена опция VB Strict, VB неявно преобразует значения в тот же тип данных. Таким образом, сравнивая строку с DateTime, VB преобразует строку в DateTime перед выполнением сравнения. Похоже, что ваша строка AppointmentDate содержит значение, которое не может быть преобразовано в правильное DateTime. docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/…docs.microsoft.com/en-us/dotnet/visual-basic/language-reference /…

2. Это немного сложно понять. app.AppointmentDate Я предполагаю, что у вас есть DateTime . Но все, о чем я знаю app , это то, что вы получаете при перечислении doAction.AppointmentSets . Просмотр doAction показывает, что это a ProgramFunctionsDataContext , но это не определено. Опять же, у вас есть if (app.AppointmentDate = DateTime.Today.ToLongDateString()) . С одним знаком равенства это присваивание внутри if . Вы имели в виду выполнить сравнение ( == )?

Ответ №1:

Это связано с тем, что вы используете = which является оператором для присвоения значения

Вместо этого вам нужно использовать == для сравнения для if оператора

ОБНОВЛЕНО: поскольку @Llama обеспокоен тем, что предыдущее решение приведет к ошибке приведения, и я неверно истолковываю сообщение об ошибке, поэтому можно использовать эти 2 решения:

Решение 1. Прямое сравнение на основе даты

 if (app.AppointmentDate.Date == DateTime.Today.Date)
 

Решение 2. сравните дату в string формате с on ToLongDateString()

 if (app.AppointmentDate.ToLongDateString() == DateTime.Today.ToLongDateString())
 

Решение 1 будет предпочтительнее, поскольку оно более простое и работает точно так же, как решение 2

При выполнении сравнения убедитесь, что оба используемых значения должны иметь один и тот же тип данных и иметь Date строковый формат, если вы приводите его к String format.

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

1. Это, должно быть, неправильно. Несмотря на = ошибку vs == , ошибка, в которой упоминаются оба DateTime и string , не может произойти, если один из типов не является a DateTime . Поскольку мы преобразуем DateTime в a string , должно быть, AppointmentDate это a DateTime . Даже если сравнение скомпилировано, оно не сработает.

2. Новая ошибка, которую получит OP, такова: «Оператор ‘==’ не может быть применен к операндам типа ‘DateTime’ и ‘string'»

3. Мы знаем, что это за тип app.AppointmentDate из сообщения об ошибке. Если бы обе стороны = были string , мы получили бы сообщение об ошибке, которое string не может быть преобразовано в a bool . Пример . Тот факт, что он сообщает нам string , что он не может быть преобразован в DateTime , говорит нам, что AppointmentDate это a DateTime .

4. Хорошо, отметил, исправлю свой ответ еще раз. Спасибо.

Ответ №2:

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

 if (app.AppointmentDate.Date == DateTime.Today)
 

.Date обнулит временную составляющую и в этом случае позволит вам сравнить ее с сегодняшней датой.

Обратите внимание на изменение с = на == . Одинарное значение равно присваиванию, а двойное значение равно сравнению на равенство.