我正在使用C#11中新的泛型数学系统,这很酷,但我还没有找到一种方法来使用数字文字或数学常量.

以下计算圆周长的示例不起作用.

public T Circumference<T>(T radius) where T : INumber<T>
{
    return 2 * Math.PI * radius;
}

Int(2)和Double(Math.PI)不能转换为T.当使用IFloatingPoint接口而不是iNumber时,这也不起作用.

有没有办法将常量和文字与数学泛型结合使用?

推荐答案

我建议使用定义了像π这样的常量的IFloatingPoint<T>接口:

public T Circumference<T>(T radius) where T : IFloatingPoint<T>
{
    return T.CreateChecked(2) * T.Pi * radius;
}

至于转换,您可以使用INumberBase<T>.ConvertX种方法(参见第thisthis个答案,我打算使用这些方法来结束重复的问题,但考虑到有关π的信息值得单独回答)

请注意,如果您仍然希望使用非浮点数字,那么您可能希望首先转换为Double(Math.PI),然后再转换为T,但无论哪种方式,您都将以精度损失告终.

Csharp相关问答推荐

更改对象的旋转方向

读取配置文件(mytest. exe. config)

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

在LINQ Where子句中使用新的DateTime

ASP.NET核心REST API返回一个非常大的数字

在调整大小的控件上绘制

使用可信第三方的Iext8.Net pdf签名

在ASP.NET Core Web API项目中通过中间件修改`Request.Path`不会更改使用的控制器/操作

什么时候接受(等待)信号灯?尽可能的本地化?

有空容错运算符的对立面吗?

.NET并发词典交换值

Lambda表达式如何与隐式强制转换一起工作?

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

异步等待Foreach循环中的ConfigureAWait(FALSE)执行什么操作?

使用System.Text.Json进行序列化时发生StackOverflow异常

在C#.NET项目中启动时,如何等待提升的PowerShell进程退出?

当我将`ConcurentDictionary`转换为`IDictionary`时,出现了奇怪的并发行为

当`JToken?`为空时?

反序列化我以前使用System.Text.Json序列化的文件时出现异常

带有类约束的C#泛型