如何覆盖`is`运算符

时间:2015-10-31 20:44:34

标签: c#

我们知道:

int? number = 10;
Console.WriteLine(number is int); // true

但:

NotNull<string> text = "10"; // NotNull<> is my struct
Console.WriteLine(text is string); // false

我希望text is string返回true,我该怎么做?

--------------------------------编辑

这是我的NotNull:

public class NotNull<T> where T : class
{
    public T Value { get; }

    private NotNull(T value)
    {
        this.Value = value;
    }

    public static implicit operator T(NotNull<T> source)
    {
        return source.Value;
    }

    public static implicit explicit NotNull<T>(T value)
    {
        if (value == null) throw new ArgumentNullException(nameof(value));
        return new NotNull<T>(value);
    }
}

如果一个班级宣布如下:

public class A
{
    public NotNull<string> B { get; set; }
}

我希望任何序列化程序都可以序列化和反序列化它:

public class A
{
    public string B { get; set; }
}

-------------------------------- edit 2

我发现这是一个不可能的问题:

  1. 如果NotNull<>是类,default(NotNull<>)为空,我什么都不做。
  2. 如果NotNull<>是struct,则default(NotNull<>).Value为空。
  3. 抱歉这个问题。

3 个答案:

答案 0 :(得分:16)

在MSDN上,您有可重载运算符列表: Overloadable Operators (C# Programming Guide)

这些运算符无法重载:

  

=,。,?:,??, - &gt;,=&gt;,f(x),as,checked,unchecked,default,delegate,is,new,sizeof,typeof

答案 1 :(得分:8)

正如其他人已经指出的那样,is cannot be overloaded。如果您发布有关不可空字符串的更多上下文,我们可以找到其他解决方案。

is运算符处理可空类型及其基础类型,不是因为它被重载,而是因为这种行为是在语言规范中明确定义的。在评估is时,可以为Nullable的类型视为特殊情况。

您可以在C#语言规范的7.10.10节中找到is运算符的详细说明。以下是与可空类型相关的部分:

  

操作E is T的结果,其中E是表达式而T是类型(...),其评估如下

     

•(...)

     

•否则,让D代表E的动态类型如下:

     
      
  • (...)

  •   
  • 如果E的类型是可空类型,则D是该可空类型的基础类型。

  •   
     

•操作结果取决于D和T,如下所示:

     
      
  • (...)

  •   
  • 如果T是可空类型,如果D是T的基础类型,则结果为真。

  •   
  • 如果T是不可为空的值类型,如果D和T的类型相同,则结果为真。

  •   

答案 2 :(得分:2)

is运算符不是可覆盖的运算符 检查一下,了解有关overridbale运算符Operator Overloading Tutorial

的更多信息