не могу понять, что такое "Где T:" в C # - PullRequest
2 голосов
/ 16 сентября 2011
 public class TwitterResponse<T>
        where T : Core.ITwitterObject
    {
       // all properties and methods here
    }

Может кто-нибудь объяснить мне, что это простыми словами? что здесь "где T: Core.ITwitterObject"? Видел это в исходном коде Twitterizer. Какие-нибудь примеры, чтобы лучше понять это?

Ответы [ 4 ]

6 голосов
/ 16 сентября 2011

Это означает, что T должен реализовывать интерфейс Core.ITwitterObject.

Если вы передаете универсальному типу T, не реализующему этот интерфейс, происходит ошибка времени компиляции.

Это условие позволяет компилятору вызывать функции, объявленные в Core.ITwitterObject в случаях T.

Обратитесь к документации для получения дополнительной информации.

Пример:

interface IFoo { void Perform(); }

class FooList<T> where T : IFoo
{
    List<T> foos;
    ...
    void PerformForAll()
    {
        foreach (T foo in foos)
            foo.Perform(); // this line compiles because the compiler knows
                           // that T implements IFoo
    }
}

Это имеет преимущество перед обычным

interface IFoo { void Perform(); }

class FooList
{
    List<IFoo> foos;
    ...
    void PerformForAll()
    {
        foreach (IFoo foo in foos)
            foo.Perform();
    }
    // added example method
    IFoo First { get { return foos[0]; } }
}

, поскольку такие методы, как First, были бы более безопасны для типов, вам не нужно понижать значение с IFoo до SomeRandomFooImpl.

2 голосов
/ 16 сентября 2011

Ключевое слово where указывает, какой тип (типы) может быть представлен T в определении универсального класса. В этом случае это означает, что может быть представлен только ITwitterObject (предположительно, интерфейс), т. Е. Вы можете использовать только объекты, которые реализуют интерфейс ITwitterObject.

Здесь довольно ясное объяснение . Отрывок ключа:

Когда вы определяете универсальный класс, вы можете применять ограничения к виды типов, которые клиентский код может использовать для аргументов типа, когда он создает экземпляр вашего класса. Если клиентский код пытается создать экземпляр вашего класс с типом, который не разрешен ограничением, результатом является ошибка времени компиляции. Эти ограничения называются ограничениями. Ограничения указываются с использованием контекстного ключевого слова where.

2 голосов
/ 16 сентября 2011

Это ограничение для дженериков, поэтому ограничение говорит, что оно должно реализовывать Core.ITwitterObject.

http://msdn.microsoft.com/en-us/library/d5x73970%28VS.80%29.aspx

2 голосов
/ 16 сентября 2011

это ограничение общего типа T. Это означает, что T может быть только Core.ITwitterObject типом

...