C# 动态转换超过了不同参数的类型不匹配错误

     2023-02-22     246

关键词:

【中文标题】C# 动态转换超过了不同参数的类型不匹配错误【英文标题】:C# Dynamic casting surpasses the type mismatch error for a different parameter 【发布时间】:2020-08-10 00:34:49 【问题描述】:

当我在将变量传递给函数的泛型类型参数之前将变量转换为类型dynamic 时,下一个参数绕过了类型检查。

在下面的sn-p中,第一次调用Check方法是如何转义编译的?(dynamic) 转换仅对第一个参数进行(其中 Type1 被传递给 Interface1)。但是将Type1 传递给Interface2 的第二个参数没有编译失败。

interface Interface1  
interface Interface2  

class Type1 : Interface1  
class Type2 : Interface2  

class Program

    public static void Check<T1, T2>(T1 obj1, T2 obj2) where T1 : Interface1 where T2 : Interface2
    
    

    static void Main(string[] args)
    
        Check((dynamic)new Type1(), new Type1()); //passes compliation and fails in runtime

        Check(new Type1(), new Type1()); //fails in compilation
    

【问题讨论】:

***.com/questions/44006718/…? 【参考方案1】:

当您在方法调用中使用 any 动态值作为参数时,该方法是动态绑定的。如果您根本使用泛型类型推断(无论是否涉及动态值),则不会验证泛型类型约束。

这是您所看到的稍微简单的版本:

using System;

class Test

    static void Main()
    
        dynamic d = 1;
        // Compiles
        M(d, 0);

        // Doesn't compile - explicit type argument
        M<int>(d, 0);
    

    static void M<T>(object ignored, T value) where T : class
    
        

编译器会进行一些检查,但在检查内容方面相对保守。从根本上说,如果您正在深入研究动态绑定领域,您应该非常小心,并期望事情可能不会像您认为的那样进行类型检查。

(如果我没记错的话,规范对于动态绑定操作执行多少检查是相当宽松的,因此您可能会遇到这样的情况:它可以用某些编译器编译,但不能用其他编译器编译。)

【讨论】:

【参考方案2】:

使用dynamic 会导致泛型类型检查延迟到运行时。一旦任何参数为dynamic,那么整个事情都会被延迟,所以在第一条语句中,单个dynamic 会导致延迟。

如果没有它,在第二个语句中,检查是在编译时完成的,因此会作为编译器错误而失败。

在这两种情况下,调用都是无效的:obj2 不能属于Type1,因为Type1 没有实现Interface2。这只是何时捕获错误的问题。

【讨论】:

c#无法向oracle数据库插入数据

...注意:先用单步调试,找出出错程序语句<1>未注册XXX动态链接库(未注册动态链接库文件或者该方法所在的类库不存在)<2>未将对象设置引用到对象实例(没有给对象正确赋值,可检查参数值,引用了未初始化的变量)<... 查看详情

使用 Decimal 参数的数据类型不匹配 - OleDb、C#、Access

】使用Decimal参数的数据类型不匹配-OleDb、C#、Access【英文标题】:DatatypemismatchusingDecimalparameter-OleDb,C#,Access【发布时间】:2013-04-2203:28:27【问题描述】:好的,所以我正在尝试将已在我的程序中更新的私有成员发送到访问数据库... 查看详情

类型不匹配解决了通过引用获取参数的闭包

】类型不匹配解决了通过引用获取参数的闭包【英文标题】:Typemismatchesresolvingaclosurethattakesargumentsbyreference【发布时间】:2016-07-2417:51:23【问题描述】:我在尝试编译下面的Rust代码时遇到了一对奇怪的错误。在寻找其他有类似... 查看详情

动手动脑(课堂作业05)第二句错误显示为:类型不匹配:不能从mammal转换为dog第三句错误显示为:类型不匹配:不能从cat转换为dog

---恢复内容开始--- 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成... 查看详情

选择查询 C# 查询中条件表达式中的数据类型不匹配错误

】选择查询C#查询中条件表达式中的数据类型不匹配错误【英文标题】:DataTypeMismatcherrorinCriteriaexpressioninSelectqueryC#query【发布时间】:2015-06-2908:59:04【问题描述】:我的示例代码如下,我收到以下错误;条件表达式中的数据类型... 查看详情

C# 和 MS Access 之间的数据类型不匹配?

】C#和MSAccess之间的数据类型不匹配?【英文标题】:DataTypemismatchbetweenC#andMSAccess?【发布时间】:2015-01-1021:56:39【问题描述】:我有一条SQL语句导致MSAccess数据库上的C#中出现错误,该数据库似乎间歇性地工作。我想我找到了问题... 查看详情

C# Access OleDb 条件表达式中的数据类型不匹配

...无法找到问题的根源......*record.Date的可空DateTime?类型显式转换为DateTime*record.Da 查看详情

为啥 PhpStorm 会报“参数类型不匹配”错误?

】为啥PhpStorm会报“参数类型不匹配”错误?【英文标题】:WhydoesPhpStormreportan"Argumenttypedoesnotmatch"error?为什么PhpStorm会报“参数类型不匹配”错误?【发布时间】:2016-11-2305:14:14【问题描述】:我正在使用PhpStorm10.0.2开发... 查看详情

具有动态参数的动态选择 mysqli 查询返回错误与绑定变量的数量不匹配

】具有动态参数的动态选择mysqli查询返回错误与绑定变量的数量不匹配【英文标题】:Dynamicselectmysqliquerywithdynamicparametersreturnserrordoesn\'tmatchnumberofbindvariables【发布时间】:2018-09-1222:54:13【问题描述】:我正在尝试使用动态where子... 查看详情

使用动态导入时玩笑与自定义错误类型不匹配

】使用动态导入时玩笑与自定义错误类型不匹配【英文标题】:jestnotmatchingcustomerrortypewhenusingdynamicimport【发布时间】:2020-06-2701:32:21【问题描述】:我定义了这个自定义错误(文件名:\'errors.ts\'):exportclassCustomErrorextendsErrorcon... 查看详情

c#方法的重载

...法重载? 方法重载是指在同一个类中方法同名,参数不同,调用时根据实参的形式,选择与实参匹配的方法执 行操作的一种技术。这里所说的参数不同是指以下几种情况:① 参数的类型不同② 参数的个数不同③... 查看详情

Ebean - 动态查询 - 准备语句的不匹配参数计数错误

】Ebean-动态查询-准备语句的不匹配参数计数错误【英文标题】:Ebean-DynamicQuery-PreparedStatement\'sMismatchedParameterCountError【发布时间】:2013-12-2809:22:02【问题描述】:我希望比我更具有Ebean专业知识的人可以帮助我解决我现在正在排... 查看详情

错误:条件表达式中的数据类型不匹配

】错误:条件表达式中的数据类型不匹配【英文标题】:Error:Datatypemismatchincriteriaexpression【发布时间】:2016-01-2323:08:11【问题描述】:我已经使用链接到AccessDB(用于学校)的C#制作了一个关于航班的程序。但是,在做了所有的... 查看详情

c#错误不一致的可访问性:参数类型'HRDMSV1.User'比方法更难访问

】c#错误不一致的可访问性:参数类型\\\'HRDMSV1.User\\\'比方法更难访问【英文标题】:c#errorInconsistentaccessibility:parametertype\'HRDMSV1.User\'islessaccessiblethanmethodc#错误不一致的可访问性:参数类型\'HRDMSV1.User\'比方法更难访问【发布时间... 查看详情

python中在进行赋值运算时即使两侧操作数的类型不同也不会报错?

...变量,不会产生任何错误:在Python中,这种赋值方式称为动态类型赋值。这意味着在Python中,变量的类型是在运行时动态确定的,而不是在编译时静态确定的。这也是Python与其他语言的一个主要区别。但是,在Python中,在进行某... 查看详情

VBA:私有子中的编译错误 ByRef 参数类型不匹配

】VBA:私有子中的编译错误ByRef参数类型不匹配【英文标题】:VBA:CompileErrorByRefArgumentTypeMismatchinPrivateSub【发布时间】:2021-11-2408:46:57【问题描述】:我一直收到编译错误:(myQuarterNo)的ByRef参数类型不匹配。我将包含提供QuarterName... 查看详情

三.面向对象基础知识

静态语言与动态语言:  静态语言:Java     1.变量类型一旦确定,不可变(只能赋,不能转)       但是可以类型转换隐式,显示     2.对象的类型,一旦确定,不会改变,一个对象本身的类型,就是new的时... 查看详情

使用访问数据类型自动编号的条件表达式c#中的数据类型不匹配

】使用访问数据类型自动编号的条件表达式c#中的数据类型不匹配【英文标题】:Datatypemismatchincriteriaexpressionc#usingaccessdatatypeautonumber【发布时间】:2017-02-0915:15:46【问题描述】:我正在使用Access,并且我的字段userId的数据类型是... 查看详情