C# 为什么if(动态&字符串)要编译?

C# 为什么if(动态&字符串)要编译?,c#,dynamic,C#,Dynamic,谁能给我解释一下为什么可以编译下面的表达式: dynamic dynValue = 42; string strValue = "TestVal"; if(dynValue && strValue) { //Do something } 我知道编译器基本上忽略了与动态,但是它不应该为字符串部分抛出错误吗?动态的基本规则是:程序在运行时的行为与程序在编译时用对象的运行时类型替换动态的行为相同 由于有些类型在编译时允许x&&someString,如果x的类型已知,那么x是动

谁能给我解释一下为什么可以编译下面的表达式:

dynamic dynValue = 42;
string strValue = "TestVal";
if(dynValue && strValue)
{
    //Do something
}

我知道编译器基本上忽略了与动态,但是它不应该为
字符串
部分抛出错误吗?

动态的基本规则是:程序在运行时的行为与程序在编译时用对象的运行时类型替换
动态
的行为相同

由于有些类型在编译时允许
x&&someString
,如果
x
的类型已知,那么
x
动态的也必须是合法的

如果在运行时发现
x
的类型不允许使用字符串
&&
,则这将是一个运行时错误


更一般地说:
动态
关闭编译时类型安全系统
。您的问题是“当我关闭类型错误检测系统时,为什么我没有得到类型错误?”当您这样问时,问题会自动回答。如果您想要类型错误,请不要关闭类型错误检测系统

动态
的基本规则是:程序在运行时的行为与编译时用对象的运行时类型替换
动态
的程序的行为相同

由于有些类型在编译时允许
x&&someString
,如果
x
的类型已知,那么
x
动态的也必须是合法的

如果在运行时发现
x
的类型不允许使用字符串
&&
,则这将是一个运行时错误


更一般地说:
动态
关闭编译时类型安全系统
。您的问题是“当我关闭类型错误检测系统时,为什么我没有得到类型错误?”当您这样问时,问题会自动回答。如果你想要类型错误,那么不要关闭类型错误检测系统,我知道,这就是我发现的原因,但是我觉得这应该在编译时抛出一个错误,因为你试图计算
&&string
dynValue
可以是任何类型(例如,
带有接受
字符串
参数的
&
运算符)这就是系统执行签入运行的原因time@DmitryBychenko谢谢你的澄清!现在我明白了:)另请看Eric Lippert最近的(和)关于一个非常类似的情况。我知道,我就是这样发现的,但是我觉得这应该在编译时抛出一个错误,因为您试图计算
&&string
dynValue
可以是任何类型(例如
,带有
&&
运算符,它接受
字符串
参数)这就是系统执行签入运行的原因time@DmitryBychenko谢谢你的澄清!现在我明白了:)另请看埃里克·利珀特(Eric Lippert)最近的(和),了解一个非常类似的情况。