1. 程式人生 > >泛型約束 | where T : class的含義

泛型約束 | where T : class的含義

泛型約束

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 泛型約束
{
    public class MyClass<T,K,V,W,X>
        where T :struct           //約束T必須為值型別
        where K : class           //約束K必須為引用型別
        where V : IComparable     //約束V必須是實現了IComparable介面
        where W : K               //要求W必須是K型別,或者K型別的子類
        where X :class ,new ()    // X必須是引用型別,並且要有一個無參的建構函式(對於一個型別有多有約束,中間用逗號隔開)

    {
        public void SayHello()
        {
            Console.WriteLine("你好"); //雖然類是一個泛型類,但是那些T,K,V,W,X型別,我可用,也可以不用。
        }

        public void SayHello(X obj)
        {
            Console.WriteLine(obj.ToString());
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //int型別是實現了IComparable介面的,所以第三個引數是可以使用int的
            MyClass<int, Stream, int, FileStream, object> mc = new MyClass<int, Stream, int, FileStream, object>();

            mc.SayHello(); //輸出:你好

            mc.SayHello("大家好!"); //輸出:大家好

            Console.ReadKey();
        }
    }
}

====================================================

public static List<T> ConvertIListtolist <T>(IList<T> gblist) where T : class
最後面的where T : class是一個引數型別約束,指定T必須是Class型別。

.NET支援的型別引數約束有以下五種:
where T : struct                            ----  T必須是一個值型別
where T : class                              ----  T必須是一個引用型別
where T : new()                             ----  T必須要有一個無參建構函式, (即他要求型別引數必須提供一個無引數的建構函式)
where T : NameOfBaseClass        ----   T必須繼承名為NameOfBaseClass的類
where T : NameOfInterface          ----  T必須實現名為NameOfInterface的介面

例如 class GenericClass2<T, V> where V:T  -------- 要求V必須繼承於T,這種稱為裸型別約束(naked type constraint)

例子

class BaseC
{
    int baseInt;
    string baseStr;
    public void Show()
    {
        Console.WriteLine("Something");
    }
}
//基類約束
class GenericClass3<T> where T : BaseC
{
    T ob1;
    public void Show()
    {
        ob1.Show();
    }
}
//new()建構函式約束
class GenericClass4<T> where T : new()
{
    public T ob1;
    public GenericClass4()
    {
        ob1 = new T();
    }
}

    

相關推薦

約束 | where T : class含義

泛型約束 using System; using System.Collections.Generic; using System.IO; using System.Linq; using Syste

Java 得到中得到T.class

在使用spring的JdbcTemplate實現DAO的時候,經常會用到一個類ParameterizedBeanPropertyRowMapper。它的靜態方法newInstance()接受一個Class型別的引數,用於將ResultSet中的屬性對映到傳入的這個C

關於C#中參數約束where T : class

name ica title logic .get ted inter host ase .NET支持的類型參數約束有以下五種:where T : struct | T必須是一個結構類型where T :

where T : class型別約束

型別引數約束,.NET支援的型別引數約束有以下五種: where T : struct | T必須是一個結構型別 where T : class T必須是一個類(class)型別 where T : new() | T必須要有一個無參建構函式 where

where T : class 約束

.NET支援的型別引數約束有以下五種:where T : struct                               | T必須是一個結構型別where T : class      

C#中的where約束中的new()

1.在MSDN上面對new()解釋說到是where字句的建構函式約束,帶有new()約束的任何型別都必須有可訪問的無參建構函式,正常來說C#建立的類預設都有一個無參的建構函式,即使你沒有寫,但是如果你寫了一個有引數的建構函式後,那麼就沒有預設無參的那個了,就需要自己手動

型別引數約束 : Controller where T : class,new()

這是型別引數約束,.NET支援的型別引數約束有以下五種: where T : struct                               | T必須是一個結構型別 where T : class                               |

第六篇 專案疑問 ------- BaseService where T : class, new() 含義

public abstract class BaseService<T> where T : class, new() { //當前倉儲 //DbSession的存放 //為了職責單一的原則,將獲取執行

C#約束

bstr 部分 name 一個 參數 list 多個 哈哈 override 本文將對各類泛型約束做一個簡單的總結。 文章一開始,給出演示代碼底稿(在此基礎上修改,演示,說明。) class MyList<T> { List<T> list

約束

pac 指定 泛型 () 使用 實現 new spa 包括 約束說明 T:struct 類型參數必須是值類型。可以指定除 Nullable 以外的任何值類型。 T:class 類型參數必須是引用類型,包括任何類、接口、委托或數組類型。 T:n

Java的約束和限制

實例 == -h 不同 java異常 轉換 component 參數 測試 不能用基本類型實例化類型參數 不能用類型參數代替基本類型:例如,沒有Pair<double>,只有Pair<Double>,其原因是類型擦除。擦除之後,Pair類含有O

通過反射將Datetable轉換為List<T>

tty eof urn tin CA ring nbsp AD 泛型集合 // 定義集合 List<T> ts = new List<T>(); // 獲得此模型的類型

Java中的標記符含義

不用 錯誤 實例 容易 bject 自定義泛型 get val 泛型 Java泛型中的標記符含義: E - Element (在集合中使用,因為集合中存放的是元素) T - Type(Java 類) K - Key(鍵) V - Value(值) N - Num

C#約束 (轉載)

六種型別的約束: T:結構 型別引數必須是值型別。可以指定除 Nullable 以外的任何值型別。有關更多資訊,請參見使用可空型別(C# 程式設計指南)。 T:類 型別引數必須是引用型別,包括任何類、介面、委託或陣列型別。

(? extends T和? super T

<? extends T>和<? super T>是泛型中的“萬用字元(Wildcards)”和“邊界(Bounds)”的概念。 <? extends T>:上界萬用字元(Upper Bounds Wildcards) <? super

約束-swift

1、泛型定義本體有參量型別約束; 2、泛型擴充套件對參量型別約束; 3、函式參量約束;   泛型型別的訪問控制: 1、與型別無關的通用函式,泛型的任何例項都可以訪問; 2、與型別有關的函式(通過擴充套件約束實現),只有特定型別例項化的泛型例項才能訪問;   由此得出結論:

手寫LinkedList, 增加小分裝,增加約束

package com.jianshun; public class Node { Node previous; //上一個節點 Node next; //下一個節點 Object element; //元素資料 public Node(Node previo

[轉]java中?和T的區別

在程式碼中經常會看到這樣的函式 public static void printColl(ArrayList<?> al){ Iterator<?> it = al.iterator(); while(it.hasNext())

中? super T和? extends T的區別

原文連結          李璟([email protected]) 經常發現有List<? super T>、Set<? extends T>的宣告,是什麼意思呢?<? super T>表示包括T在內的任何T的父類,<? extends

C#入門學習類、集合、方法、約束委託

本章閱讀列表 泛型很難理解?不然 泛型集合和ArrayList的裝箱拆箱 常見的泛型型別 泛型類和泛型方法 泛型約束 泛型委託 泛型很難理解?不然 在接觸的一個新的概念的時候,總會感覺難以理解,當你掌握並能熟練地使用的時候,發現這個概念其實簡單的,我相信