mamy sobie DLL-kę z jedną klasą statyczną, jedną metodą statyczną, wyświetlającą int
a:
public ref class Klasa abstract sealed
{
public: static void ShowInt(int^ i)
{
System::Console::WriteLine(*i);
}
};
skompilować przez cl /LD /clr:safe
coby nikt nie powiedział że to jakieś unsafe jest.
Teraz błędny program w C#:
class Program
{
static void Main()
{
Klasa.ShowInt(2.5f); // float!
}
}
który się kompiluje i wywala, oraz jego odpowiednik w C++:
int main()
{
Klasa::ShowInt(2.5f); // float!
}
który się nie kompiluje.
Po zmianie w DLL-ce linii
System::Console::WriteLine(*i);
na System::WriteLine(i);
program w C# zaczyna działać, i wyświetla 2,5 (a funkcja ShowInt podobno wyświetla inta).
Wniosek: bezpieczeństwo typów bezpieczeństwem, ale jak bardzo chcieć to w .Net strzelić sobie w nogę nadal można. I to wszystko w ramach kodu “safe”.