我有一个结构:
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;
}
}现在我可以做:
bool x = new Decibel (0) < new Decibel (1);编译器似乎足够聪明,可以将Decibel转换为double,然后使用<操作符进行加倍操作?
我有不同的struct名为Duration,它是包装TimeSpan的。它对TimeSpan进行了隐式的Duration转换,但是<和>运算符不起作用。
c#只识别原语类型之间的转换吗?
发布于 2015-04-29 09:26:29
首先,请注意,C#最多允许在类型之间进行一次隐式用户定义的转换。
因此,当您比较Decibel的两个实例时,编译器看到它可以使用用户定义的隐式转换将Decibel转换为要与之进行比较的double。
但是,当您比较两个Duration实例时,编译器找不到它可以用来进行比较的任何一个隐式转换。编译器将不会考虑任何用户定义的比较运算符的任何类型,类型可以被隐式转换。它将只查找可以隐式转换该类型的任何类型的内置比较运算符。
因此,编译器将不会使用隐式转换到TimeSpan,即使TimeSpan提供了一个理论上可以使用的用户定义的比较运算符。
还要注意的是,即使TimeSpan类提供了对double的隐式转换,编译器仍然不会使用它,因为它最多只考虑隐式转换链中的一个隐式用户定义的转换。
换言之,鉴于这些结构:
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;
}
}此代码将编译:
bool x = new Number(1) < new Number(2);当然,这也是如此:
Number n1 = new NumberWrapper(1);
Number n2 = new NumberWrapper(2);
bool z = n1 < n2;但这不会:
bool y = new NumberWrapper(1) < new NumberWrapper(2);因为NumberWrapper没有隐式转换到任何支持<的类型,而没有任何进一步的隐式转换。
请注意,所有原始数字和枚举类型(例如char、短、int、long、浮、双、十进制、枚举)都提供内置的比较运算符。所有其他类型只能提供用户定义的比较运算符。
用户定义的比较操作符如下所示:
public static bool operator < (MyType lhs, MyType rhs) ...https://stackoverflow.com/questions/29938811
复制相似问题