小编Chi*_*nim的帖子

C#,多个==运算符重载,没有模糊的空值检查

简介:
我有一些类可以完成相同的工作,但具有不同的值类型(例如浮点数或整数的向量).
现在我希望能够检查相等性,这种相等性也应该在类型之间起作用(例如vectorF == vectorI).
此外,应该可以进行空检查(vectorF == null).

方法:
我的方法是为==和!=运算符创建多个重载,每个可能的组合一个.

public sealed class VectorF
{
    [...]

    public static bool operator == (VectorF left, VectorI right)
    {
        // Implementation...
    }

    public static bool operator == (VectorF left, VectorF right)
    {
        // Implementation...
    }

    // Same for != operator
    [...]
}
Run Code Online (Sandbox Code Playgroud)

问题:
使用多个重载,我不能只使用==运算符进行空检查,因为调用将是不明确的.

var v = new VectorF([...]);

if (v == null)    // This call is ambiguous
[...]
Run Code Online (Sandbox Code Playgroud)

我知道有可能使用ReferenceEquals或null cast,但这种方法对我来说是一个严重的限制.

var v = new VectorF([...]);

if(object.ReferenceEquals(v, null))    // Would …
Run Code Online (Sandbox Code Playgroud)

c# operator-overloading null-check

18
推荐指数
2
解决办法
2151
查看次数

使用元组作为接口通用的显式接口实现不起作用

情况
我正在尝试实现一个专门的集合,该集合为项目分配权重。
我不能使用A,List<(T, double)>因为该集合需要跟踪更多信息以提供特殊功能。
但是,此集合应实现IList<(T, double)>,以便我可以使用一些扩展方法。

方法

实施接口的工作原理:

public class WeightedList<T> : IList<(T item, double weight)> 
{
    public void Add((T item, double weight) item)
    {
        this.Add(item.item, item.weight);
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

但是,为了保持实现的整洁,我想显式地实现其一些方法。

public class WeightedList<T> : IList<(T item, double weight)> 
{
    // The method name Add is marked as source of error
    void IList<(T item, double weight)>.Add((T item, double weight) item)
    {
        this.Add(item.item, item.weight);
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

问题
但是现在,我突然出现错误,并且似乎不再能够识别显式接口实现。

错误CS0535:“ WeightedList”未实现接口成员“ ICollection <(T项,双倍权重)>。Add((T项,双倍权重))”

错误CS0539:在可以实现的接口成员中找不到显式接口声明中的'WeightedList.Add((T …

c# c#-7.0

2
推荐指数
1
解决办法
38
查看次数

标签 统计

c# ×2

c#-7.0 ×1

null-check ×1

operator-overloading ×1