如果我在类中重载!
运算符,它应该返回什么类型?在一本书中我找到了这个(部分列表):
public class MyType {
public int IntField { get; set; }
public MyType(int intField) {
IntField = intField;
}
public static bool operator !(MyType mt) {
return (mt.IntField <= 0);
}
它确实编译,但我希望!
运算符返回MyType
实例,类似于
public static MyType operator !(MyType mt) {
var result = new MyType(-mt.IntField);
return result;
}
实际上,我希望编译器要求!
运算符返回MyType
。但事实并非如此。
那么......为什么!
运算符的返回类型不必是包含类型?您执行必须使++
或--
的返回类型成为包含类型。
答案 0 :(得分:11)
假设我问你“连接的返回类型是什么”?你打算说什么?可能你转过身来问“串联什么?”连接是在字符,字符串,序列,可连接的deques,语言,离散有限自动机和其他一千种事物上定义的,因此返回的类型由参数的类型决定。但通常,连接的类型是参数的类型。不总是;例如,两个字符串联是一个字符串。但通常。
同样,问题是“运营商的类型是什么?”完全取决于被否定的东西,你还没有说出你在否定的东西。通常,T的否定是另一个T,但不一定是。
我怀疑你没有问正确的问题。我认为你应该问的问题是“你将超载!运算符的现实场景是什么?”你从这本书中给出的例子是可怕的;它没有激发为什么代码的作者完全覆盖运算符。
这是一个更现实的例子。假设我们生活在一个没有可空类型的世界里。您可能决定使用三值逻辑:
sealed class MyBool
{
private MyBool() {} // No one creates it!
public static MyBool True = new MyBool();
public static MyBool False = new MyBool();
public static MyBool Unknown = new MyBool();
好的,否定MyBool的规则是什么? True变为False,False变为True,Unknown将变为Unknown:
public static MyBool operator !(MyBool b)
{
if (b == True) return False;
if (b == False) return True;
return Unknown;
}
在这种情况下,类型!运营商是MyBool。
当然,由于C#2.0我们有Nullable<bool>
形式的三值逻辑,但您可能需要更复杂的逻辑(或者您可能正在编写C#1.0代码)。
更难以得出一个合理的例子,其中否定一个Foo导致一个Bar;某种“monadic”工作流对象可能是一种可能的情况 - 其中给定类型的对象的否定是表示延迟执行否定的不同类型的对象。