TL;博士:你不能。
您注意到没有非泛型类型INumber
which INumber<TSelf>
实施,因为这会造成严重破坏。
当您必须声明时,您知道代码中发生了不好的事情
var numbers = new object[] { 1, 2.5, 5, 0x1001, 72 };
握住你的INumber<T>
values.
您也无法声明,例如就像是
var numbers = new INumber<>[] { 1, 2.5, 5, 0x1001, 72 };
因为你会遇到CS7003 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs7003: "意外使用未绑定的通用名称"
假设存在一个非泛型接口类型INumber
这是一个基本类型INumber<TSelf>
(同样的方式IEnumerable
是一个基本类型IEnumerable<T>
).
For INumber
为了有用,它必须有像运算符这样的东西 - 但这些也必须是非通用的 - 因此,例如,非通用版本的IAdditionOperators<TSelf,TOther,TResult>界面 https://learn.microsoft.com/en-us/dotnet/api/system.numerics.iadditionoperators-3(它定义了+
运算符)必须存在 - 它必须采取INumber, INumber
作为其论点。
现在,假设你有一个类型,UserDefinedNumber : INumber<UserDefinedNumber>
你有
INumber a = 1d;
INumber b = new UserDefinedNumber(...);
var c = a + b;
现在——你会期待什么a + b
to do?
由于运算符的左侧和右侧都键入为INumber
,编译器将使用+
操作符开启a
(这是一个double
)但由于这是一个内置类型,因此它不可能有任何逻辑来处理添加double
to a UserDefinedNumber
.