否定运算符(!)的重载应具有哪种类型?

| 如果我在类中重载
!
运算符,应返回哪种类型?我在一本书中发现了这个(部分列出):
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
。但事实并非如此。 那么...为什么why0ѭ运算符的返回类型不必为包含类型?您必须将返回类型
++
--
作为包含类型。     
已邀请:
        假设我问您“串联的返回类型是什么”?你打算说什么?可能您会转过身去问“串联什么?”,在字符,字符串,序列,可连接的双端队列,语言,离散有限自动机和一千种其他东西上定义了链连接,因此返回的类型由类型决定论据。但通常,串联的类型是参数的类型。不总是;例如,两个字符的串联是一个字符串。但是通常。 类似地,“!运算符的类型是什么?”这个问题完全取决于要取反的内容,而您没有说出要取反的内容。通常,一个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的否定会导致酒吧的情况。某种“ monadic”工作流对象可能是一种可能的情况-给定类型的对象的求反是表示推迟执行求反的不同类型的对象。     

要回复问题请先登录注册