我们知道:
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
我发现这是一个不可能的问题:
NotNull<>
是类,default(NotNull<>)
为空,我什么都不做。NotNull<>
是struct,则default(NotNull<>).Value
为空。抱歉这个问题。
答案 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