C# 11 新特性:接口中的静态抽象成员

之前

假设我们有一个非常复杂的数学运算方法:

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 新特性:接口中的静态抽象成员

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下定义的数字类型,intdouble都继承了INumber接口:

C# 11 新特性:接口中的静态抽象成员

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 提供的新特性,可在接口中添加静态抽象成员

此功能的主要场景是在泛型类型中使用数学运算符,因为运算符必须定义为静态抽象的:

C# 11 新特性:接口中的静态抽象成员

除此之外,也可以在接口中定义其他静态成员和静态属性:

public interface IDemo
{
    public static abstract string StaticProperty { get; set; }
}