首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用< and >运算符时,支持什么隐式转换?

当使用< and >运算符时,支持什么隐式转换?
EN

Stack Overflow用户
提问于 2015-04-29 08:54:27
回答 1查看 343关注 0票数 8

我有一个结构:

代码语言:javascript
复制
public struct Decibel
{
    public readonly double Value;

    public Decibel (double value)
    {
        Value = value;
    }

    public static implicit operator Decibel (double decibels)
    {
        return new Decibel (decibels);
    }

    public static implicit operator double (Decibel decibels)
    {
        return decibels.Value;
    }
}

现在我可以做:

代码语言:javascript
复制
bool x = new Decibel (0) < new Decibel (1);

编译器似乎足够聪明,可以将Decibel转换为double,然后使用<操作符进行加倍操作?

我有不同的struct名为Duration,它是包装TimeSpan的。它对TimeSpan进行了隐式的Duration转换,但是<>运算符不起作用。

c#只识别原语类型之间的转换吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-29 09:26:29

首先,请注意,C#最多允许在类型之间进行一次隐式用户定义的转换。

因此,当您比较Decibel的两个实例时,编译器看到它可以使用用户定义的隐式转换将Decibel转换为要与之进行比较的double

但是,当您比较两个Duration实例时,编译器找不到它可以用来进行比较的任何一个隐式转换。编译器将不会考虑任何用户定义的比较运算符的任何类型,类型可以被隐式转换。它将只查找可以隐式转换该类型的任何类型的内置比较运算符。

因此,编译器将不会使用隐式转换到TimeSpan,即使TimeSpan提供了一个理论上可以使用的用户定义的比较运算符。

还要注意的是,即使TimeSpan类提供了对double的隐式转换,编译器仍然不会使用它,因为它最多只考虑隐式转换链中的一个隐式用户定义的转换。

换言之,鉴于这些结构:

代码语言:javascript
复制
public struct Number
{
    public readonly double Value;

    public Number(double value)
    {
        Value = value;
    }

    public static implicit operator Number(double duration)
    {
        return new Number(duration);
    }

    public static implicit operator double(Number number)
    {
        return number.Value;
    }
}

public struct NumberWrapper
{
    public readonly Number Value;

    public NumberWrapper(Number value)
    {
        Value = value;
    }

    public static implicit operator NumberWrapper(Number duration)
    {
        return new NumberWrapper(duration);
    }

    public static implicit operator Number(NumberWrapper number)
    {
        return number.Value;
    }
}

此代码将编译:

代码语言:javascript
复制
bool x = new Number(1) < new Number(2);

当然,这也是如此:

代码语言:javascript
复制
Number n1 = new NumberWrapper(1);
Number n2 = new NumberWrapper(2);
bool z = n1 < n2;

但这不会:

代码语言:javascript
复制
bool y = new NumberWrapper(1) < new NumberWrapper(2);

因为NumberWrapper没有隐式转换到任何支持<的类型,而没有任何进一步的隐式转换。

请注意,所有原始数字和枚举类型(例如char、短、int、long、浮、双、十进制、枚举)都提供内置的比较运算符。所有其他类型只能提供用户定义的比较运算符。

用户定义的比较操作符如下所示:

代码语言:javascript
复制
public static bool operator < (MyType lhs, MyType rhs) ...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29938811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档