Nadal nie mam do czynienia z przeciążaniem operatorów. Myślałem, że wykonuję świetną robotę, dopóki nie dotknęłam tego problemu. Wyjątek NullReferenceException jest zgłaszany dla operatora! =. Zakładam, że używa go w metodzie CompareTo, ale nie jestem całkowicie pewien. Jeśli ktokolwiek może wskazać mi właściwy kierunek, byłbym bardzo wdzięczny.Jak poprawnie zastąpić równość?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
List<Task> tasks = new List<Task>();
tasks.Add(new Task("first", DateTime.Now.AddHours(2)));
tasks.Add(new Task("second", DateTime.Now.AddHours(4)));
tasks.TrimExcess();
tasks.Sort();
}
}
public class Task : IComparable
{
public Task()
{
}
public Task(string nameIn, DateTime dueIn)
{
nameOfTask = nameIn;
dateDue = dueIn;
}
DateTime dateDue;
string nameOfTask;
public static bool operator <(Task t1, Task t2)
{
return (t1.dateDue < t2.dateDue);
}
public static bool operator >(Task t1, Task t2)
{
return (t1.dateDue > t2.dateDue);
}
public static bool operator ==(Task t1, Task t2)
{
return (t1.dateDue == t2.dateDue);
}
public static bool operator !=(Task t1, Task t2)
{
return (t1.dateDue != t2.dateDue);
}
public override int GetHashCode()
{
return Int32.Parse(this.dateDue.ToString("yyyymmddhhmmss"));
}
public override bool Equals(System.Object obj)
{
if (obj == null) return false;
Task t = obj as Task;
if ((System.Object)t == null) return false;
return (this.dateDue == t.dateDue);
}
int IComparable.CompareTo(object obj)
{
if (obj == null) return 1;
Task t = obj as Task;
if (t != null)
{
return this.dateDue.CompareTo(t.dateDue);
}
else
throw new ArgumentException("Object is not a Task");
}
}
}
Kiedy komentuję operatorów binaory program działa zgodnie z przeznaczeniem. Moje pytanie brzmi: jak mogę chronić moje operatory binarne przed zerowymi referencjami, więc mogę zachować je dla ręcznych porównań? Dziękuję za poświęcony czas.
Jeden z obiektów 'Task' porównywany z'! = 'Ma wartość' null'. – dasblinkenlight
Prawo-o .. Musisz założyć, że 't1' i/lub' t2' może mieć wartość zerową we wszystkich tych statycznych funkcjach. –