C# не компилирует следующий код:
using System;
namespace ConsoleApplication5
{
class Program
{
static void Main()
{
var x = new C();
x.foo();
}
}
class A<T>
{
public virtual void foo()
{
System.Console.WriteLine("a");
}
}
class B : A<object>
{
public override void foo()
{
base.foo();
System.Console.WriteLine("b");
}
}
class C : B
{
public override void foo()
{
(base as A<object>).foo(); // Так нельзя
((A<object>)base).foo(); // Так тоже нельзя
System.Console.WriteLine("c");
}
}
}
Аналогичный код компилируют
| C++/CLI |
| using namespace System;
namespace ConsoleApplication5
{
generic<class T>
ref class A
{
public: virtual void foo()
{
System::Console::WriteLine("a");
}
};
ref class B : A<System::Object^>
{
public: virtual void foo() override
{
__super::foo();
System::Console::WriteLine("b");
}
};
ref class C : B
{
public: virtual void foo() override
{
A<Object^>::foo();
System::Console::WriteLine("c");
}
};
}
using namespace ConsoleApplication5;
int main(array<System::String ^> ^args)
{
C^ x = gcnew C();
x->foo();
return 0;
}
|
| |
и
| Nemerle |
| module Program
{
Main() : void
{
def x = C();
x.foo();
}
}
class A[T] {
public virtual foo () : void {
System.Console.WriteLine ("a");
}
}
class B : A[object]{
public override foo () : void {
base.foo ();
System.Console.WriteLine ("b");
}
}
class C : B {
public override foo () : void {
(base : A[object]).foo ();
System.Console.WriteLine ("c");
}
}
|
| |
Выводит
a
c
Вопрос почему в C# нельзя приводить base к заданому типы, а в C++/CLI это разрешили ?
P.S.
С Новым Годом !