日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# 协变与抗变

發布時間:2025/3/21 C# 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# 协变与抗变 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義

  • 協變:與原始類型轉換方向相同的可變性稱為協變。
  • 抗變:與派生類型轉換方向相同的可變性稱為抗變。
  • 補充:

  • 參數是協變的,可以使用派生類對象傳入需要基類參數的方法,反之不行
  • 返回值是抗變的,不能使用派生類對象接收返回了基類對象的方法返回值,反之可以
  • 代碼展示

    public class 協變和抗變 {/// <summary>/// 基類/// </summary>public class Shape{public double Width { get; set; }public double Height { get; set; }public override string ToString() => $"width:{Width},height:{Height}";}/// <summary>/// 派生類/// </summary>public class Rect : Shape{}#region 協變接口/// <summary>/// 協變接口 --------------- 協變--》屬性和索引器必須實現get/// </summary>public interface IIndex<out T> // out聲明接口為協變類型接口,繼承了該接口的對象可以實現協變的隱式轉換。 --對應調用方法中的shapes{T this[int index] { get; }int Count { get; }}/// <summary>/// 接口實現類/// </summary>public class RectCollection : IIndex<Rect>{private Rect[] data = new Rect[3] {new Rect{ Height=2,Width=5},new Rect{ Height=3,Width=7},new Rect{ Height=4.5,Width=2.9},};private static RectCollection _coll;public static RectCollection GetRect() => _coll ?? (_coll = new RectCollection());public Rect this[int index]{get{if (index < 0 || index > data.Length)throw new ArgumentOutOfRangeException("index is out of range");return data[index];}}public int Count => data.Length;}#endregion#region 抗變接口/// <summary>/// 抗變接口 --------------- 抗變--》屬性和索引器必須實現set/// </summary>public interface IDisplay<in T> // in聲明接口為抗變類型接口,繼承了該接口的對象可以實現抗變的隱式轉換。 --對應調用方法中的rectDisplay{void Show (T item);}/// <summary>/// 抗變實現類/// </summary>public class ShapeDisplay : IDisplay<Shape>{public void Show(Shape item) => Console.WriteLine($"{item.GetType().Name} width:{item.Width} height:{item.Height}");}#endregionstatic void Main(){// 協變調用 Rect-》Shape 向派生程度低的類裝換IIndex<Rect> rects = RectCollection.GetRect();IIndex<Shape> shapes = rects; // 如果IIndex接口的參數沒有使用out修飾為協變,則轉換報錯(隱式轉換會編譯錯誤,顯示轉換會運行錯誤)for (int i = 0; i < shapes.Count; i++){Console.WriteLine(shapes[i]);}// 抗變調用 Shape-》Rect 向派生程度高的類轉換IDisplay<Shape> shapeDisplay = new ShapeDisplay();IDisplay<Rect> rectDisplay = shapeDisplay; // 如果IDisplay接口的參數沒有使用in修飾為抗變,則轉換報錯rectDisplay.Show(rects[0]);} }

    轉載于:https://www.cnblogs.com/LTEF/p/10127607.html

    總結

    以上是生活随笔為你收集整理的c# 协变与抗变的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。