之前
假设我们有一个非常复杂的数学运算方法:
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】,邀你加入技术交流群