C#中的泛型返回类型

时间:2010-09-09 23:04:55

标签: c# generics

正在练习泛型。考虑下面的堆栈方法。除了在泛型方法中抛出异常之外,执行错误检查的最佳方法是什么。如果我想在此方法中返回一些结果,该怎么办?

public T pop()
{
    if (top >= 0)
        return arr[top--];
    return -1 or null;
}

7 个答案:

答案 0 :(得分:15)

你唯一能做的就是返回default(T),这是类型T的默认值(null用于引用类型,零用于整数类型,零用于字段对象其他价值类型)。但是,这通常是一个坏主意,因为您无法区分弹出的0或指示错误的0。在这种情况下,例外通常是最好的方法,但您也可以按如下方式更改方法:

public bool TryPop(out T value)
{
    if (top >= 0)
    {
        value = arr[top--];
        return true;
    }
    value = default(T);
    return false;
}

答案 1 :(得分:6)

您可以执行return default(T),它将返回0个初始值类型(例如,所有数值类型将初始化为0),并且对于引用类型为null。

答案 2 :(得分:1)

好像你的问题确实有两个部分

第一部分是如果一个默认值不可用,如何提供默认值。正如其他人指出的那样,C#表达式default(T)将适用于这种情况。它返回引用类型的null和结构的0初始化值。

第二部分是处理错误情况的最佳方法,而不是抛出异常。集合API倾向于将TryXXX模式用于此类场景

bool TryPop(out T value) { 
  if ( top >= 0 ) {
    value = arr[top--];
    return true;
  }
  value = default(T);
  return false;
}

答案 3 :(得分:1)

我来到这里寻找一个稍微不同的问题的解决方案,涉及一个静态方法,它接受两个通用数组并返回一个新的通用数组。由于我的方法是静态的,我不能使用这个例子,除了作为灵感。相反,我开发了以下解决方案。

T [ ] raMerged = ( T [ ] ) alMerged.ToArray ( typeof ( T ) );
return raMerged;

在上面的代码片段中,alMerged是一个通用对象T的数组列表。

这满足方法签名指定的合同条件,如下所示。

public static T [ ] MergeNewItemsIntoArray<T> (
T [ ] paMasterList ,
T [ ] paNewItems )
where T : IComparable , new ( )

在签名中,where子句说明了我在几个主题中找到的另一个问题的解决方案,其中没有一个直接解决了这个问题。然而,希望这至少会帮助另一个灵魂。

答案 4 :(得分:0)

你的问题不清楚。错误检查可以像往常一样完成 - 捕获异常。 引发错误通常应该通过抛出异常来完成。毕竟,这就是他们的目标。

如果你想返回null,你可以这样做,但是你必须确保类型T是一个类,而不是结构,如下所示:

public T pop()
    where T: class
{
     ...
}

答案 5 :(得分:0)

如果你想在堆栈为空时能够返回null,你可以尝试这样的事情:

class GenericStack<T>
{
    T[] arr;
    int top;

    public T pop()
    {
        if (top >= 0)
            return arr[top--];
        return default(T);
    }
}

然后你可以使用这样的用法:

        var stack = new GenericStack<int?>();

        var res = stack.pop(); // res will be null

请注意堆栈对象的类型是int?所以我们可以返回空值。

答案 6 :(得分:0)

直接方法(使用泛型和返回值或null)

class DemoClass<T> where T : struct
{
   public T? PopValueOrNull() 
   { 
     if ( this._top >= 0 ) { 
        return this._arr[this._top--];
      } 

      return null; 
    }
}