Operator overloading in generic struct: can I create overloads for specific kinds(?) of generic?(泛型结构中的运算符重载:是否可以为特定类型(?)创建重载普通的吗?)
问题描述
我使用泛型结构在C#中定义物理单元,在收到错误之前一直运行正常:
二元运算符的参数之一必须是包含类型
当尝试重载数学运算符以便它们在不同单位之间转换时。因此,我有如下内容:
public interface ScalarUnit { }
public class Duration : ScalarUnit { }
public struct Scalar<T> where T : ScalarUnit
{
    public readonly double Value;
    public Scalar(double Value)
    {
        this.Value = Value;
    }
    public static implicit operator double(Scalar<T> Value)
    {
        return Value.Value;
    }
}
public interface VectorUnit { }
public class Displacement : VectorUnit { }
public class Velocity : VectorUnit { }
public struct Vector<T> where T : VectorUnit
{
    #...
    public static Vector<Velocity> operator /(Vector<Displacement> v1, Scalar<Duration> v2)
    {
        return new Vector<Velocity>(v1.Magnitude / v2, v1.Direction);
    }
}
+和-运算符没有任何错误,我只是在处理Vector<T>,但是当我在替身中为T发一个单元时,它突然不喜欢它了。有没有办法实现这一点?
我认为它可以工作,因为Displacement实现了VectorUnit接口,并且我在struct头中有where T : VectorUnit。我至少是在正确的轨道上吧?我刚接触C#,所以有时很难理解发生了什么。
推荐答案
我认为运算符不能是泛型的。
我可能会考虑硬编码运算符中的类型,也就是说,如果typeof(T).GetGenericParameters()[0]是这样或那样的类型胡说八道。
我甚至更喜欢的另一种方法是在所有返回双精度值的子类中实现一个公共接口/基类,然后从运算符将其向下强制转换为该接口/B.class并获取要计算的值。
注意:通过convention,接口名称应始终以I开头(示例:IScalarUnit)。
这篇关于泛型结构中的运算符重载:是否可以为特定类型(?)创建重载普通的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:泛型结构中的运算符重载:是否可以为特定类型(?)创建重载普通的吗?
				
        
 
            
        基础教程推荐
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
 - 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
 - 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
 - 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
 - 如何动态获取文本框中datagridview列的总和 2022-01-01
 - 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
 - 全局 ASAX - 获取服务器名称 2022-01-01
 - JSON.NET 中基于属性的类型解析 2022-01-01
 - 错误“此流不支持搜索操作"在 C# 中 2022-01-01
 - 首先创建代码,多对多,关联表中的附加字段 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
						
						
						
						
						
				
				
				
				