否定运算符(!)的重载应该具有什么类型

本文关键字:类型 什么 重载 运算符 | 更新日期: 2023-09-27 18:00:00

如果在类中重载!运算符,它应该返回什么类型?在一本书中,我发现了这个(部分列表):

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。但事实并非如此。

所以。。。为什么!运算符的返回类型不一定是包含类型?您必须使返回类型++--为包含类型。

否定运算符(!)的重载应该具有什么类型

假设我问你"串联的返回类型是什么"?你会怎么说?你可能会回过头来问"什么的连接?"连接是在字符、字符串、序列、可连接的deques、语言、离散有限自动机和其他一千种东西上定义的,所以返回的类型由参数的类型决定。但通常串联的类型是参数的类型。并不总是;例如,两个字符的串联就是一个字符串。但通常情况下。

同样,"!运算符的类型是什么?"这个问题完全取决于被否定的内容,而你还没有说出你被否定的东西。通常,一个T的否定是另一个T,但它不一定是。

我怀疑你问的问题不对。我认为你应该问的问题是"在什么样的现实场景中,你会让!运算符过载?"你在书中给出的例子很糟糕;这根本不能说明代码的作者为什么要重写运算符。

这里有一个更现实的例子。假设我们生活在一个没有可为null类型的世界里。您可能决定使用三值逻辑:

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的规则是什么?真变假,假变真,未知保持未知:

    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的情况;某种"一元"工作流对象可能是一种情况——给定类型的对象的否定是另一类型的对象,表示否定的延迟执行。