| 

.NET C# Java Javascript Exception

2
Hallo,
Ich benutze Code Contracts unter C# und habe ein komisches Verhalten beobachtet:
In einen Konstruktor wird durch Code Contracts überprüft/sichergestellt, dass der Übergabeparameter nicht null sein darf.

Dies klappt perfekt, solange die Klasse keinen
public static bool operator ==
und
public static bool operator !=
besitzt.
Ist dies der Fall, wird keine Exception geworfen und die Anweisungen nach der Code-Contracts-Zeile werden ausgeführt.

Handelt es sich hierbei um einen Bug oder warum wird die Code-Contracts-Zeile in diesem Fall ignoriert?

Hier das Minimalbeispiel:
using System;
using System.Diagnostics.Contracts;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test
{
public class MyTestObject
{
public MyTestObject(MyTestObject s)
{
Contract.Requires<ArgumentNullException>(s != null, "object must not be null");
int hashCode = s.GetHashCode();

}

public static bool operator !=(MyTestObject left, MyTestObject right)
{
return true;
}

public static bool operator ==(MyTestObject left, MyTestObject right)
{
return false;
}
}

[TestClass]
public class ContractErrorTest
{
[TestMethod]
public void TestOfExceptionIsThrown()
{
MyTestObject to = new MyTestObject(null);
}
}
}
21.03.2011
schudan 23 2
3 Antworten
4
So gehts:

Contract.Requires<ArgumentNullException>((object)s != null, "object must not be null");


Alternative kannst du das Problem auch in den operanten lösen:

public static bool operator !=(MyTestObject left, MyTestObject right)
{
return !(left == right)
}

public static bool operator ==(MyTestObject left, MyTestObject right)
{
if (System.Object.ReferenceEquals(left, right))
return true;

if ((object)left == null)
return false;

if ((object)right == null)
return false;

return ... left.Feld1 = right.Feld1 && left.Feld2 = right.Feld2 ...; //Detailvergleich der Felder
}
21.03.2011
Floyd 11,0k 3 9
Floyd 11,0k 3 9
2
Die CodeContracts-Zeile wird nicht ignoriert, sie benutzt vielmehr Deinen !=-Operator. Der liefert immer true, also ist der Contract immer erfüllt.
21.03.2011
Matthias Hlawatsch 8,4k 2 8
0
Vielen Dank für die Antwort, das war es.
Die Operatoren sind bei mir in einer Basisklasse definiert und natürlich komplexer. Blöderweise habe ich den dort gemachten Fehler unbewusst in das Minimalbeispiel mit übernommen.
21.03.2011
schudan 23 2

Stelle deine .net-Frage jetzt!