之前
假設我們有一個非常復雜的數學運算方法:
public?static?int?Calc(int?x,?int?y)?=>?x?+?y;
但是,上述方法只能支持int
類型。如果需要傳入其它數字類型,需要再次定義:
public?static?double?Calc(double?x,?double?y)?=>?x?+?y;
對于這種需求,我們更希望采取范型的方式實現:
public?static?T?Calc<T>(T?x,?T?y)?=>?x?+?y;
但是,運算符“+”無法應用于“T”和“T”類型的操作數:
C# 11
引用System.Runtime.Experimental
NuGet 包,并且在項目文件中添加<EnablePreviewFeatures>True</EnablePreviewFeatures>
。
定義如下方法:
public?static?T?Calc<T>(T?x,?T?y)?where??T?:?INumber<T>?=>?x?+?y;
現在,無論傳遞何種數據類型,都可正常執行:
Calc(4,?5);
Calc(4.0,?5.0);
這是因為,我們使用的是System.Runtime.Experimental
下定義的數字類型,int
、double
都繼承了INumber
接口:
而INumber
接口又繼承了IAdditionOperators
接口,定義了運算符“+”:
public?interface?IAdditionOperators<TSelf,?TOther,?TResult>?where?TSelf?:?IAdditionOperators<TSelf,?TOther,?TResult>
{public?static?abstract?TResult?operator?+(TSelf?left,?TOther?right);
}
這里就運用了 C# 11 提供的新特性,可在接口中添加靜態抽象成員。
此功能的主要場景是在泛型類型中使用數學運算符,因為運算符必須定義為靜態抽象的:
除此之外,也可以在接口中定義其他靜態成員和靜態屬性:
public?interface?IDemo
{public?static?abstract?string?StaticProperty?{?get;?set;?}
}
添加微信號【MyIO666】,邀你加入技術交流群