-2

我可以定义一个扩展方法来确定一个对象是否为空

public static bool IsNull(this object obj) {
    if (obj == null)
        return true;
    else return false;
}

但我也可以这样做:

public static bool IsNull<T>(this T obj) {
    if(obj == null)
        return true;
    else return false;
}

两者都应用于每个对象。这个T的目的是什么?进一步详细说明预期的类型是什么?如果是,为什么这typeof(T)是可能的?(this T obj) where T: int)那么(where )背后的原因是什么?正如@MatthewWatson 指出的那样,这无论如何都不起作用

这么多的问题。

4

3 回答 3

5

T是通用方法的类型参数。

有关泛型的 MSDN 文档,请参见此处:http: //msdn.microsoft.com/en-us/library/512aeb7t.aspx

这与扩展方法无关;这只是与泛型有关。

于 2013-06-19T13:02:02.943 回答
3

T 表示通用。这意味着类型未知。默认情况下,它是一个对象,因为一切都是 .Net 中的对象。但是你可以用 where 范式专门化 T。例如,其中 T 是 IDisposable。那么您的函数将仅适用于 IDisposable 类型。

于 2013-06-19T13:02:07.510 回答
1

T历史上的意思Type。按照惯例,它用于定义通用(在 C++ 中 - 模板)参数。在您的示例中,这不是必需的,因为 .NET 基础结构中的任何对象都继承了 base object

但是请记住 C++ 的美好时光,那时甚至还没有引入 C#。C++ 只有普通类型没有共同的父(即object)。所以开发人员被迫使用一些东西告诉编译器“这里会有一些东西被替换,实际上我不知道具体是什么,但稍后在编译时就会清楚。请为我做吧”。

回到符号,在 MFC 中使用了另一个前缀——C比如CString.

UPD:您的第一个示例将不起作用,因为它是扩展并且null对象没有任何方法,即使是您IsNull

UPD1:不要看上面的UPD,蛋糕是骗人的。

于 2013-06-19T13:08:10.013 回答