Ошибка при включении тумблера в C # [дубликат]

Возможно, проблема в конфигурации почтового сервера, чтобы избежать подобных проблем или вам не нужно беспокоиться о проблеме с почтовым сервером, я рекомендую вам использовать PHPMailer , это плагин у которого есть все необходимое для отправки почты, единственное, что вы должны учесть, это иметь SMTP-порт (порт: 25 и 465), включен

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
       //Server settings
       $mail->SMTPDebug = 0;                                 
       $mail->isSMTP();                                      
       $mail->Host = 'smtp.gmail.com';  
       $mail->SMTPAuth = true;                               
       $mail->Username = 'correo@gmail.com';                 
       $mail->Password = 'contrasenia';                           
       $mail->SMTPSecure = 'ssl';                          
       $mail->Port = 465;                                    

       //Recipients
       $mail->setFrom('correo@gmail.com', 'my name');    
       $mail->addAddress('destination@correo.com');               

       //Attachments
       $mail->addAttachment('optional file');         // Add files, is optional

       //Content
       $mail->isHTML(true);// Set email format to HTML
       $mail->Subject = utf8_decode("subject");
       $mail->Body    = utf8_decode("mail content");
       $mail->AltBody = '';
       $mail->send();
     }
     catch (Exception $e){
        $error = $mail->ErrorInfo;
     }

57
задан GibboK 14 March 2016 в 08:45
поделиться

3 ответа

Эта строка:

private dynamic defaultReminder = 
                          reminder.TimeSpanText[TimeSpan.FromMinutes(15)];

Вы не можете использовать переменную экземпляра для инициализации другой переменной экземпляра . Зачем? Поскольку компилятор может их переупорядочить, нет гарантии, что reminder будет инициализирован до defaultReminder, поэтому вышеприведенная строка может выбросить NullReferenceException.

Вместо этого, просто используйте:

private dynamic defaultReminder = TimeSpan.FromMinutes(15);

В качестве альтернативы настройте значение в конструкторе:

private dynamic defaultReminder;

public Reminders()
{
    defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; 
}

. Более подробная информация об этой ошибке компилятора в MSDN - Ошибка компилятора CS0236 .

89
ответ дан Oded 23 August 2018 в 01:13
поделиться
  • 1
    Java более «прощает» для таких конструкций. Не знаю, хорошо ли это. [Д0] stackoverflow.com/questions/1494735/… – Wouter Schut 3 February 2015 в 12:52
  • 2
    Нет, компилятор не может изменить порядок инициализаторов. Спецификация языка C # заявляет в разделе «10.5.5.2 Инициализация поля экземпляра» следующее: Инициализаторы переменных выполняются в текстовом порядке, в котором они отображаются в объявлении класса. Это даже повторяется в "10.11.2 Инициализаторы переменных экземпляра" где они говорят: Инициализаторы переменных выполняются в текстовом порядке, в котором они появляются в объявлении класса. Итак, ваше объяснение неверно. Заказ исправлен. Причина, по которой это запрещено, заключается в том, что дизайнеры C # этого хотели. – Jeppe Stig Nielsen 18 April 2016 в 20:16
  • 3
    (Только в случае partial class с «частями» в нескольких файлах порядок инициализаторов поля неясен, но это также относится к полям static!) – Jeppe Stig Nielsen 18 April 2016 в 20:18
  • 4
    @WouterSchut Поток, на который вы ссылаетесь, не о Java ?! Речь идет также о C #, однако с полями static вместо полей экземпляра. – Jeppe Stig Nielsen 18 April 2016 в 20:33
  • 5
    @JeppeStigNielsen Потому что они хотели, чтобы этот способ всегда был плохой причиной для выбора языка. Если бы он мог работать, за исключением того, что они решили не позволять ему работать, то они заставляют разработчиков работать по своему выбору, что в некоторых случаях может занять довольно много дополнительного кода, в зависимости от того, что нам нужно делать. – Andrew 5 May 2017 в 13:11

Вам нужно поместить этот код в конструктор вашего класса:

private Reminders reminder = new Reminders();
private dynamic defaultReminder;

public YourClass()
{
    defaultReminder = reminder.TimeSpanText[TimeSpan.FromMinutes(15)];
}

Причина в том, что вы не можете использовать одну переменную экземпляра для инициализации другой с помощью инициализатора поля, поскольку выполнение порядок инициализаторов полей не определен.

17
ответ дан Daniel Hilgarth 23 August 2018 в 01:13
поделиться
  • 1
    Четко определен порядок инициализаторов полей! См. Мой комментарий к ответу Одеда. – Jeppe Stig Nielsen 18 April 2016 в 20:22

вы можете использовать это как

private dynamic defaultReminder => reminder.TimeSpanText[TimeSpan.FromMinutes(15)]; 
6
ответ дан jin wang 23 August 2018 в 01:13
поделиться
  • 1
    Добро пожаловать в переполнение стека! Хотя этот фрагмент кода может решить вопрос, в том числе объяснение , действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, так как это уменьшает читаемость кода и объяснений! – jmattheis 6 August 2016 в 19:46
  • 2
    Используется = & gt; вместо =, что делает его собственностью. – wooohoh 24 December 2016 в 02:15