.net 如何使类型安全依赖于数字?(就像泛型依赖于类型一样)

vcirk6k6  于 2022-12-05  发布在  .NET
关注(0)|答案(1)|浏览(556)

我希望有一个Type“用于”某个数字,另一个Type用于另一个数字。但是我不希望必须为每个数字手动定义一个Type,如Level1024Level1000。我希望为每个数字示例化Level类的示例很简单。就像我们对泛型所做的那样,我们可以创建一个Level<string>和一个Level<int>,而不需要为每个Level定义一个单独的Level
我们的想法是这样的:

Level<1024> topPlayerOf1K;
Level<1000> Abe = new Level<1000>();
topPlayerOf1K = Abe; //This should show a squiggly line in Visual Studio.

我怎样才能做到这一点或类似的东西?

des4xlb0

des4xlb01#

数字常值在C#中不像在TypeScript中那样被视为型别,而且不能像C++中的样板参数那样当做泛型参数使用。
至少,你必须为你想使用的每个数字文字创建类型。方法如下:

interface IConstantInt { int Value { get; } }

class ConstantInt1000 : IConstantInt { public int Value => 1000; }
class ConstantInt1024 : IConstantInt { public int Value => 1024; }

class Level<TConstantInt> where TConstantInt : IConstantInt { }

var level1000 = new Level<ConstantInt1000>();
var level1024 = new Level<ConstantInt1024>();

如果你有很多这样的代码的话,最好自动生成这些代码,这不是一个很好的解决方案,但是如果你不了解你的程序,也不知道你要防止什么样的错误,抽象地说,这是一种你可以在类型系统中编码数字文字的方法。

相关问题