Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.Net中函数接口参数的类型检查乐趣_.net_Compiler Construction_Interface_Parameters_Typechecking - Fatal编程技术网

VB.Net中函数接口参数的类型检查乐趣

VB.Net中函数接口参数的类型检查乐趣,.net,compiler-construction,interface,parameters,typechecking,.net,Compiler Construction,Interface,Parameters,Typechecking,当其中一个参数是接口时,VisualStudio似乎停止了对函数参数的类型检查 考虑以下几点: ”接口和实现它的类: 公共接口 端接口 公共A类 执行IA 末级 '演示的另一个参考类型: 公共类MyReferenceType 末级 '使用IA作为其中一个参数类型的函数: 私有函数SomeFunc(ByVal a作为IA,ByVal r作为MyReferenceType) 一无所获 端接头 下面是一个类型检查问题的示例: Private子示例() 将a调暗为IA=新a Dim r作为新的MyRe

当其中一个参数是接口时,VisualStudio似乎停止了对函数参数的类型检查

考虑以下几点:

”接口和实现它的类:
公共接口
端接口
公共A类
执行IA
末级
'演示的另一个参考类型:
公共类MyReferenceType
末级
'使用IA作为其中一个参数类型的函数:
私有函数SomeFunc(ByVal a作为IA,ByVal r作为MyReferenceType)
一无所获
端接头
下面是一个类型检查问题的示例:

Private子示例()
将a调暗为IA=新a
Dim r作为新的MyReferenceType
'其他一些随机引用类型,请选择任意
'您喜欢的其他引用类型
作为新列表的Dim列表(字符串)
'对SomeFunc的每个调用都会编译,不会出错。
SomeFunc(r,r)
SomeFunc(r,a)
SomeFunc(列表,r)
SomeFunc(列表,a)
'由于类型不匹配而无法编译
'SomeFunc(列表,列表)
端接头

正如我的评论所指出的,这段代码编译得很好,编辑器中也没有错误。如果我执行这个程序,尽管我得到了
System.InvalidCastException
,这一点都不奇怪。我猜这是编译器中的类型检查错误?我使用的是Visual Studio 2005,那么这在更高版本的VS中是否已修复?

我相信这是因为您已经退出。若您首先打开Option Strict,代码将无法编译,这正是我们所期望的

请注意:

SomeFunc(list, a)
不是这样的:

SomeFunc(list, list)
在第一种情况下,当Option Strict处于禁用状态时,编译器实际上是在为您插入强制转换。毕竟,
IA
类型的值可以是
MyReferenceType

在第二种情况下,
List(of String)
的值永远不能与
MyReferenceType
兼容(值
Nothing
…)是一个有争议的例外),因此即使选项Strict off,编译也会失败。编译器不会让您尝试无法工作的东西


这个故事的寓意是:为了更好地进行类型检查,请打开Option Strict。

我相信这是因为您已经下车了。若您首先打开Option Strict,代码将无法编译,这正是我们所期望的

请注意:

SomeFunc(list, a)
不是这样的:

SomeFunc(list, list)
在第一种情况下,当Option Strict处于禁用状态时,编译器实际上是在为您插入强制转换。毕竟,
IA
类型的值可以是
MyReferenceType

在第二种情况下,
List(of String)
的值永远不能与
MyReferenceType
兼容(值
Nothing
…)是一个有争议的例外),因此即使选项Strict off,编译也会失败。编译器不会让您尝试无法工作的东西


故事的寓意:为了更好地进行类型检查,请打开选项Strict。

你是对的!我必须以某种方式关闭了Option Strict off,MSDN说默认状态为on。你是对的!我必须以某种方式关闭了Option Strict off,MSDN说默认状态为on。