You should override the ToString
method.
Firstly: Console.WriteLine
accepts object
and calls ToString
method from it.
Secondly: Sometime in the future you may need to create class, derived from the Message
. Let's look at this:
using System;
using System.IO;
namespace Namespace
{
class StringCastBase
{
public static explicit operator string(StringCastBase o)
{
return "string cast base";
}
}
class StringCastDerived : StringCastBase
{
public static explicit operator string(StringCastDerived o)
{
return "string cast derived";
}
}
class ToStringOverridenBase
{
public override string ToString()
{
return "ToString overriden base";
}
}
class ToStringOverridenDerived : ToStringOverridenBase
{
public override string ToString()
{
return "ToString overriden derived";
}
}
class Programm
{
public static void Main()
{
StringCastBase scb = new StringCastBase();
Console.WriteLine((string)scb);
StringCastBase scd = new StringCastDerived();
Console.WriteLine((string)scd);
ToStringOverridenBase tsob = new ToStringOverridenBase();
Console.WriteLine(tsob);
ToStringOverridenBase tsod = new ToStringOverridenDerived();
Console.WriteLine(tsod);
}
}
}
The output will be
string cast base
string cast base
ToString overriden base
ToString overriden derived
Since the static type of scd
is StringCastBase
, the StringCastBase
's conversion method will be called (even when dynamic type is not StringCastBase
). Using virtual method ToString
solves this problem.