2011-06-21 35 views
4

如果我在类中超载!运算符,它应该返回什么类型?在本书中,我发现这个(部分列表):否定运算符(!)的重载应具有哪种类型?

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

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

+5

这个例子很糟糕。这是从哪里来的? –

+0

我不想诋毁这本书的作者,所以我不打算命名这本书。尽管我会*指出作者这个问题及其答案。 – comecme

+1

如果作者出版了这本书,他必须准备好批评书中所表达的观点。这个例子很可怕,而且这本书的其余部分都很好。 – SolutionYogi

回答

11

假设我问过“连接的返回类型是什么”?你打算说什么?可能你会转过身来问“连接什么?”在字符,字符串,序列,可链接deque,语言,离散有限自动机和其他一千个事物上定义了连接,所以返回的类型由参数的类型决定。但通常,串联的类型是参数的类型。不总是;例如,两个字符的串联是一个字符串。但通常。

同样,问题“!运算符的类型是什么?”完全取决于什么被否定,你没有说出你的否定。通常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的否定规则是什么?真成为假,假成为真,未知成员未知:

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”工作流对象可能是一种可能的情况 - 对给定类型的对象的否定是表示否定的延迟执行的不同类型的对象。

+1

在中找到'MyBool'的一个例子。Net Framework是['SqlBoolean'](http://msdn.microsoft.com/zh-cn/library/system.data.sqltypes.sqlboolean.aspx)。另请参见[SqlBoolean.LogicalNot](http://msdn.microsoft.com/zh-cn/library/system.data.sqltypes.sqlboolean.op_logicalnot.aspx),尽管返回值文档看起来有点不合适,但我认为。 – Brian

+2

否定可能产生不同类型的非设计示例是将逻辑表达式表示为类型时。因此,例如,将否定(!)应用于LogicalOr对象实际上可能会返回LogicalNot。 – LBushkin

+0

@LBushkin:的确,我考虑过去那里。如果你创建True和False等类型,你可以建立一个系统,你可以强制编译器解决一些逻辑问题,以便对程序进行类型检查。通过构建这样的程序,您可以显示对C#程序的分析至少是NP-HARD。尽管如此,我认为这可能有点神秘。 –