Проблемы с набором огурцов Textmate - "Run Feature" выдает ошибки

Из файла функций огурца, когда я перехожу к «Выполнить функции», я получаю сообщение об ошибке ниже во всплывающем окне.

Как мне это исправить?


/ Library / Ruby / Site / 1. В MSDN они даже дошли до указания, как сделать явную реализацию члена интерфейса доступной для наследования путем создания другого абстрактного или виртуального члена, который вызывается явной реализацией члена интерфейса. Пока нет проблем.

Но тогда мне интересно: Почему в C # возможно переопределить любой явно реализованный член интерфейса, просто указав интерфейс явно ?

] Например, предположим, что у меня есть такой простой интерфейс со свойством и методом:

public interface IMyInterface
{
    bool AlwaysFalse { get; }
    bool IsTrue(bool value);
}

И класс A , который явно реализует интерфейс и имеет метод Test () , который вызывает собственную реализацию члена интерфейса.

public class A : IMyInterface
{
    bool IMyInterface.AlwaysFalse
    { get { return false; } }

    bool IMyInterface.IsTrue(bool value)
    { return value; }

    public bool Test()
    { return ((IMyInterface)this).AlwaysFalse; }
}

Как видите, ни один из четырех членов не является виртуальным или абстрактным, поэтому, когда я определяю класс B следующим образом:

public class B : A
{
    public bool AlwaysFalse
    { get { return true; } }

    public bool IsTrue(bool value)
    { return !value; }
}

Тогда вы ожидаете, что экземпляр B , приведенный к A , будет вести себя как A . И это действительно так:

A a = new A();
Console.WriteLine(((IMyInterface)a).AlwaysFalse);    // False
Console.WriteLine(((IMyInterface)a).IsTrue(false));  // False
Console.WriteLine(a.Test());                         // False
A b = new B();
Console.WriteLine(((IMyInterface)b).AlwaysFalse);    // False
Console.WriteLine(((IMyInterface)b).IsTrue(false));  // False
Console.WriteLine(b.Test());                         // False

Теперь приходит подвох. Создайте класс C , который является точной копией B , за исключением одного момента в объявлении класса:

public class C : A, IMyInterface
{ /* ... same as B ... */ }

Теперь экземпляр C при приведении к A , ведет себя не как A , а как C :

A c = new C();
Console.WriteLine(((IMyInterface)c).AlwaysFalse);    // True
Console.WriteLine(((IMyInterface)c).IsTrue(false));  // True
Console.WriteLine(c.Test());                         // True

Даже метод Test () теперь вызывает переопределенный метод в C ! Почему это?

17
задан John Saunders 14 September 2010 в 00:25
поделиться