0
点赞
收藏
分享

微信扫一扫

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#

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​​接口:

C# 11 新特性:接口中的静态抽象成员_运算符_02

正在上传…重新上传取消

而​​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 新特性:接口中的静态抽象成员_上传_03

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

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

举报

相关推荐

0 条评论