簡體   English   中英

C#中的泛型返回類型

[英]Generic return type in C#

正在練習泛型。 考慮下面的堆棧方法。 除了在泛型方法中拋出異常之外,執行錯誤檢查的最佳方法是什么。 如果我想在此方法中返回一些結果,該怎么辦?

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

您唯一能做的就是返回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;
}

您可以return default(T) ,它將返回0個初始化值類型(例如,所有數值類型將初始化為0),並且null為引用類型。

我來到這里尋找一個稍微不同的問題的解決方案,涉及一個靜態方法,它接受兩個通用數組並返回一個新的通用數組。 由於我的方法是靜態的,我不能使用這個例子,除了作為靈感。 相反,我開發了以下解決方案。

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

在上面的代碼片段中,alMerged是一個通用對象T的ArrayList。

這滿足方法簽名指定的合同條件,如下所示。

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

在簽名中,where子句說明了我在幾個線程中找到的另一個問題的解決方案,其中沒有一個直接解決了這個問題。 然而,希望這至少會幫助另一個靈魂。

看來你的問題確實有兩個部分

第一部分是如果一個默認值不可用,如何提供默認值。 正如其他人指出的那樣,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;
}

你的問題不清楚。 錯誤檢查可以像往常一樣完成 - 捕獲異常。 通常應該通過拋出異常來引發錯誤。 畢竟,這就是他們的目標。

如果你想返回null你可以這樣做,但是你必須確保類型T是一個類,而不是結構,如下所示:

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

如果你想在堆棧為空時能夠返回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? 所以我們可以返回空值。

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

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

      return null; 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM