Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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 尝试在函数头中使用类型为(包含类型)的变量_Vb.net_Types_Typeof - Fatal编程技术网

Vb.net 尝试在函数头中使用类型为(包含类型)的变量

Vb.net 尝试在函数头中使用类型为(包含类型)的变量,vb.net,types,typeof,Vb.net,Types,Typeof,我知道很多问题都是相似的,但可能是因为很多问题都与C有关,我无法轻松地将其翻译成VB.Net,因此我无法在任何地方找到解决以下问题的方法。函数Test获取一个参数TypToValidate,该参数指定要检查的类型 函数中的代码将文本中的行块读入字符串变量。根据读取的内容,该字符串可能是“abc”或“0.307”或“12”或其他任何内容。然后,函数必须检查该字符串是否可以转换为TypeToValidate指定的类型。如果是,则函数将已验证的文本块作为字符串返回;如果不是,则抛出一个错误 Funct

我知道很多问题都是相似的,但可能是因为很多问题都与C有关,我无法轻松地将其翻译成VB.Net,因此我无法在任何地方找到解决以下问题的方法。函数Test获取一个参数TypToValidate,该参数指定要检查的类型

函数中的代码将文本中的行块读入字符串变量。根据读取的内容,该字符串可能是“abc”或“0.307”或“12”或其他任何内容。然后,函数必须检查该字符串是否可以转换为TypeToValidate指定的类型。如果是,则函数将已验证的文本块作为字符串返回;如果不是,则抛出一个错误

Function Test(... , Optional ByVal TypeToValidate as Type = String) as String
  ChunkOfText = SomeFile.ReadLine
  If TypeOf(ChunkOfText) Is TypeToValidate Then 
    Return ChunkOfText
  Else
    Throw ex As ApplicationException ' or whatever like this
  End If 
  ...
我理解“类型”本身不能用作类型,类型的类型,将类型作为值。 I.o.w.,我不能将类型传递给函数,或者我可以吗

显然,我可以用

Function Test(..., Optional ByVal TypeToValidate as String = "String") as String
并将字符串(如“Byte”、“Integer”、“Int32”等)传递给函数,而不是类型,但这似乎不是很专业。。。并允许出现错误。
有什么帮助吗,最好是在VB.Net中?

我认为可选参数在这里不起作用,因为它必须用常量表达式初始化

类型为
类型的变量
必须与类型为
类型
的另一个表达式进行比较,并使用
=
。这只是测试两个值是否相等

Function Test(someVar As Object, typeToValidate As Type) As Boolean
    Return someVar?.GetType() = typeToValidate
End Function
应用于变量的
.GetType()
获取描述对象运行时类型的
类型
对象

(我在这里使用了一个运算符,以防值为
Nothing


另一种可能是使用泛型函数并使用
TypeOf someVar is T
进行测试,其中
T
是一个类型名称(作为标识符而不是字符串给出)或泛型类型参数

Function Test(Of T)(someVar As Object) As Boolean
    Return TypeOf someVar Is T
End Function
然后,我们可以用

Dim obj As Object
obj = "Hello"

If Test(Of String)(obj) Then
    Console.WriteLine("obj is a String")
End If
见:


还要注意的是,写这样的东西是没有意义的

If someCondition Then
    Return True
Else
    Return False
End If
someCondition
(可以是任何布尔表达式)已生成值
True
False
。因此,您可以简单地将其返回

Return someCondition
或者您可以使用:

即使这似乎是一个奇怪的要求(每个人都有自己的理由),但在某些方面都是可行的。正如上面Olivier所说,或者下面的代码是如何显示的。您也可以将类型参数用作可选参数,但难题是当该可选参数仍然为空时。在本例中,不表示测试的类型

Function Test(SomeVars As Object, Optional ByVal TypeToValidate As Type = Nothing) As Boolean
    Return TypeToValidate IsNot Nothing AndAlso TypeToValidate.Equals(SomeVars.GetType)
End Function
用法:

    Console.WriteLine("Test String 'Is String'" & Test("Is String", GetType(String)).ToString)
    Console.WriteLine("Test Integer for 10 " & Test(10, GetType(Integer)).ToString)
    Console.WriteLine("Test Integer for 12.12 " & Test(12.12, GetType(Integer)).ToString)

GetType(String),但不能用作可选参数的默认值。VB没有生成类型为的常量表达式的语法。这是一个很好的伙伴,C。如果你不描述你为什么需要它,你就无法找到一个好的选择。我已经扩展了我的问题,以更好地传达我想要实现的目标。在我的第一次尝试中,我尽量简短,但显然失败了。抱歉。请注意,
TypeOf(ChunkOfText)
始终是
String
。这个字符串包含的文本不重要。你不能使用“Nothing”作为可选默认值吗?是的,这是个好主意。然后,当
typeToValidate
Nothing
时,我们将测试
someVar
是否为
字符串;然而,调用方不知道将执行哪种类型的测试。我认为最好显式地传递类型。这两个版本的
Test
可以用作重载方法(我在测试代码示例时实际执行的操作)。因为函数已经从许多地方调用过,所以新的
TypeToValidate
参数必须是
可选的
Nothing
确实不起作用,但奇怪的是,
TypeToValidate'仍然保持着
Nothing`即使我尝试给它赋值,比如
TypeToValidate=GetType(String)
@OlivierJacot Descombes感谢您提供了一个非常简单明了的泛型函数示例!我会保留它。您也可以简单地编写
返回TypeToValidate不是空的,还可以编写TypeToValidate.Equals(SomeVars.GetType)
。不需要使用
If
语句和第二个
Return
语句。看起来很有希望,但正如所指出的那样,
TypeToValidate
似乎总是保持
Nothing
。然后,我也无法在针对
TypToValidate
的函数中执行
CType
TryCast