В чем разница между (это как IFoo <string>). Do () и просто this.Do () в следующем коде? - PullRequest
0 голосов
/ 15 апреля 2020

Я часто нахожу, как в ArrayMarkupExtension.cs , люди выполняют кастинг, который мне кажется тривиальным.

Рассмотрим упрощенную версию следующим образом.

Что такое разница между (this as IFoo<string>).Do() и this.Do() в следующем коде?

interface IFoo
{
    object Do();
}

interface IFoo<out T> : IFoo
{
    new T Do();
}

class Something : IFoo<string>
{
    public string Do()
    {
        return this.GetType().Name;
    }

    object IFoo.Do()
    {
        //return this.Do();
        return (this as IFoo<string>).Do();
    }
}

1 Ответ

0 голосов
/ 30 апреля 2020

Я только что понял.

  • (this as IFoo<string>).Do(); вызывает string IFoo<string>.Do() => "IFoo<string>.Do()";, если оно доступно. В противном случае он вызывает public string Do() => "Do()";.

  • this.Do();, может вызывать только public string Do() => "Do()";

Полный код:

interface IFoo
{
    object Do();
}

interface IFoo<out T> : IFoo
{
    new T Do();
}

class Something : IFoo<string>
{
    string IFoo<string>.Do() => "IFoo<string>.Do()";

    public string Do() => "Do()";

    //object IFoo.Do() => (this as IFoo<string>).Do();

    object IFoo.Do() => this.Do();
}

class Program
{
    static void Main()
    {
        IFoo<string> x = new Something();
        Console.WriteLine(x.Do());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...