Avere in un linguaggio .NET un metodo pubblico, non statico, conforme al CLS e di una classe pubblica, in un assembly, non necessariamente vuol dire che possa essere richiamato da un altro assembly!
L'esempio non è evidente: il metodo toString in questo snippet J#:
class A extends java.lang.Object
{
public String toString()
{
return "A::toString";
}
}
non può essere richiamato da C#:
class Test
{
static void Main()
{
// error CS0117: 'A' does not contain a definition for 'toString'
System.Console.WriteLine(new A().toString());
}
}
se non lo sostituiamo con ToString. Da VisualBasic .NET invece, va ("identifiers are case insensitive"):
Class Test
Shared Sub Main()
' OK
System.Console.WriteLine(New A().toString())
End Sub
End Class
E questo perché:
"In Visual J#, java.lang.Object is treated as a language-specific root of the object hierarchy. The means to access this object from languages supported by the common language runtime is through System.Object. Thus, such languages do not see Visual J# objects as special objects deriving from java.lang.Object." (Object Hierarchy Semantics)
e quindi il compilatore Visual J# "sostituisce" java.lang.Object con System.Object e toString con ToString.
Non so i compilatori .NET per gli altri linguaggi che hanno una superclasse di tutte le altre classi come la considerano - per esempio in Scala esiste una superclasse di tutte le classi, scala.Any.