z * 2我应该如何在最后一行实现 int ( ) 的乘法?
public static TResult Test<TResult>() where TResult : INumber<TResult>
{
TResult x = TResult.AdditiveIdentity;
TResult y = TResult.MultiplicativeIdentity;
TResult z = x * y;
TResult z2 = z * 2; // <--- this gives the CS0019 error "The operator * cannot be applied to operands of type 'TResult' and 'int'
return z2;
}
Run Code Online (Sandbox Code Playgroud)
--- 建议的解决方案是添加一个接口,但它打破了这一点:
IMultiplyOperators<TResult, int, TResult>
public static void Tester()
{
Test<decimal>(); // CS0315 Tye type decimal cannot be used as …Run Code Online (Sandbox Code Playgroud) 我有以下通用数学函数:
private static T Fade<T>(T t)
where T : IFloatingPoint<T>
{
return t * t * t * (t * (t * 6 - 15) + 10);
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会编译,因为6、15和10不是 类型T。
我能想到的最好的解决方案是定义一个静态类,如下所示:
private static class GenericValues<T>
where T : IFloatingPoint<T>
{
public static readonly T Two = T.One + T.One;
public static readonly T Three = Two + T.One;
public static readonly T Four = Three + T.One;
public static readonly T Five …Run Code Online (Sandbox Code Playgroud) INumber<T>假设我们有一个接受并返回的通用方法int:
// process val and return as int
static int DoSomething<T>(T val) where T : INumber<T> => ...
Run Code Online (Sandbox Code Playgroud)
如何将其T投射到int.
我刚刚将 Visual Studio 2022 升级到 .NET7,其中包括 C# 11。我有兴趣尝试新的静态抽象接口方法,因此按照那里的教程进行操作。
本文展示了如何定义Point和Translation记录使用新IAdditionOperators<>接口...
public record Translation<T>(T XOffset, T YOffset) where T : IAdditionOperators<T, T, T>;
public record Point<T>(T X, T Y) where T : IAdditionOperators<T, T, T> {
public static Point<T> operator +(Point<T> left, Translation<T> right) =>
left with { X = left.X + right.XOffset, Y = left.Y + right.YOffset };
}
Run Code Online (Sandbox Code Playgroud)
这使您能够执行此操作...
var pt = new Point<int>(3, 4);
var translate = new Translation<int>(5, 10);
var …Run Code Online (Sandbox Code Playgroud) 我们可以使用.NET 7中的新INumber<TSelf>接口来引用任何数字类型,如下所示:
using System.Numerics;
INumber<int> myNumber = 72;
INumber<float> mySecondNumber = 93.63f;
Run Code Online (Sandbox Code Playgroud)
但是,由于 中的类型限制INumber,我们无法拥有可以保存任何数字类型的通用引用。以下代码无效:
using System.Numerics;
INumber myNumber = 72;
myNumber = 93.63f;
Run Code Online (Sandbox Code Playgroud)
我怎样才能拥有任何数字对象的数组并调用需要对象的方法INumber<TSelf>。
using System.Numerics;
object[] numbers = new object[] { 1, 2.5, 5, 0x1001, 72 };
for (int i = 0; i < numbers.Length - 1; i++)
{
Console.WriteLine("{0} plus {1} equals {2}", numbers[i], numbers[i + 1], AddNumbers(numbers[i], numbers[i + 1]));
}
static T AddNumbers<T>(T left, T right) where T : …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个通用计算器类,它可以支持非常基本的算术运算,例如 add 、 sub 和 mul 。但我收到下面提到的错误。我感觉我需要在“T”上添加通用约束,以允许仅在支持 + 运算符的类型上进行操作。但无法找出解决方案。如果您能提供很好的解释来帮助我理解它的这个基本部分,那将会有很大的帮助。
“运算符‘+’不能应用于‘T’和‘T’类型的操作数
这是添加操作的代码。请提出解决此问题的解决方案。
**//this approach works**
using System.Numerics;
namespace dotnet_basic;
public class Calculator
{
public T Add<T>(T num1, T num2)
where T : INumber<T> => num1 + num2;
public T Subtract<T>(T num1, T num2)
where T : INumber<T> => num2 - num1;
}
**//Corrected the second approach now even this approach works**
namespace dotnet_basic;
public class CalculatorNew<T> where T : INumber<T>
{
public T Add(T num1, T num2)
{
return num1 + …Run Code Online (Sandbox Code Playgroud)