#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
показывает, что это aProgramFunctionsDataContext
, но это не определено. Опять же, у вас есть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
, не может произойти, если один из типов не является aDateTime
. Поскольку мы преобразуемDateTime
в astring
, должно быть,AppointmentDate
это aDateTime
. Даже если сравнение скомпилировано, оно не сработает.2. Новая ошибка, которую получит OP, такова: «Оператор ‘==’ не может быть применен к операндам типа ‘DateTime’ и ‘string'»
3. Мы знаем, что это за тип
app.AppointmentDate
из сообщения об ошибке. Если бы обе стороны=
былиstring
, мы получили бы сообщение об ошибке, котороеstring
не может быть преобразовано в abool
. Пример . Тот факт, что он сообщает намstring
, что он не может быть преобразован вDateTime
, говорит нам, чтоAppointmentDate
это aDateTime
.4. Хорошо, отметил, исправлю свой ответ еще раз. Спасибо.
Ответ №2:
Предполагая, что вы хотите сравнить только компонент даты, вы можете переписать свое утверждение следующим образом:
if (app.AppointmentDate.Date == DateTime.Today)
.Date
обнулит временную составляющую и в этом случае позволит вам сравнить ее с сегодняшней датой.
Обратите внимание на изменение с =
на ==
. Одинарное значение равно присваиванию, а двойное значение равно сравнению на равенство.