无法理解C#中的“哪里T:”

时间:2011-09-16 13:53:11

标签: c# c#-2.0

 public class TwitterResponse<T>
        where T : Core.ITwitterObject
    {
       // all properties and methods here
    }

有人可以用简单的术语解释这是什么意思吗?什么是“哪里T:Core.ITwitterObject”在这里?在Twitterizer源代码中看到了这一点。有什么例子可以更好地理解这个吗?

4 个答案:

答案 0 :(得分:6)

这意味着T必须实现接口Core.ITwitterObject

如果传递给通用类型T未实现此接口,则会发生编译时错误。

这个条件允许编译器在Core.ITwitterObject的实例上调用T中声明的函数。

查看documentation了解更多信息。

示例:

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

答案 1 :(得分:2)

它是泛型类型T的约束。它意味着T只能是Core.ITwitterObject类型

答案 2 :(得分:2)

这是泛型的约束,因此约束说它必须实现Core.ITwitterObject。

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

答案 3 :(得分:2)

where关键字指定泛型类定义中T可以表示的类型。在这种情况下,它意味着只能表示ITwitterObject(可能是一个接口),即您只能使用实现ITwitterObject接口的对象。

非常清楚explanation here。关键摘录:

  

定义泛型类时,可以对其应用限制   客户端代码可用于类型参数的各种类型   实例化你的类。如果客户端代码试图实例化您的   具有约束不允许的类型的类,结果是a   编译时错误。这些限制称为约束。   使用where contextual关键字指定约束。