溫馨提示×

如何在C#中定義和使用約束

c#
小樊
84
2024-08-28 11:02:07
欄目: 編程語言

在C#中,約束是與泛型類型參數一起使用的條件,它們限制了可以用于該類型參數的類型

  1. 基類約束:要求類型參數必須是指定類型的子類型或者是該類型本身。
  2. 接口約束:要求類型參數必須實現(xiàn)指定的接口。
  3. 構造函數約束:要求類型參數必須具有無參數的公共構造函數。
  4. 引用類型約束:要求類型參數必須是引用類型(如類、接口或委托)。
  5. 值類型約束:要求類型參數必須是值類型(如結構體或枚舉)。
  6. 默認構造函數約束:要求類型參數必須具有默認構造函數。
  7. 等效約束:要求類型參數必須與另一個類型參數具有相同的基類型。
  8. 不等式約束:要求類型參數不能為特定類型。

下面是一個示例,展示了如何在C#中定義和使用約束:

using System;

// 定義一個泛型接口,其中 T 必須實現(xiàn) IComparable<T> 接口
public interface ISortAlgorithm<T> where T : IComparable<T>
{
    void Sort(T[] array);
}

// 定義一個泛型類,其中 T 必須是引用類型
public class MyClass<T> where T : class
{
    private T _value;

    public MyClass(T value)
    {
        _value = value;
    }

    public T GetValue()
    {
        return _value;
    }
}

// 定義一個泛型類,其中 T 必須具有無參數的公共構造函數
public class MyOtherClass<T> where T : new()
{
    private T _instance;

    public MyOtherClass()
    {
        _instance = new T();
    }

    public T GetInstance()
    {
        return _instance;
    }
}

// 定義一個泛型方法,其中 T 必須是值類型
public static class Utility
{
    public static bool IsDefault<T>(T value) where T : struct
    {
        return EqualityComparer<T>.Default.Equals(value, default(T));
    }
}

在這個示例中,我們定義了一個泛型接口 ISortAlgorithm<T>,其中 T 必須實現(xiàn) IComparable<T> 接口。我們還定義了一個泛型類 MyClass<T>,其中 T 必須是引用類型。此外,我們還定義了一個泛型類 MyOtherClass<T>,其中 T 必須具有無參數的公共構造函數,以及一個泛型方法 IsDefault<T>,其中 T 必須是值類型。

0