gpt4 book ai didi

vb.net - 带有 Option Strict On 的 VB 中的 .NET 4.0 框架动态功能?

转载 作者:行者123 更新时间:2023-12-03 14:57:01 25 4
gpt4 key购买 nike

有什么办法可以使用4.0框架中的新动态特性,比如ExpandoObject在 VB.NET 中没有设置 Option Strict Off ?使用 C#,您会失去类型安全性 只有使用您专门声明为 dynamic 的变量.但是对于 VB,我发现使用这些功能的唯一方法是使用旧的 Option Strict Off从一开始就存在于 VB.NET 中的技巧。如果没有 Option Strict,文件中的所有内容都会被模糊类型污染,如下所示:

Option Explicit On
Option Strict Off
Option Infer On

Partial Public Class ClassX

Public Sub TestDynamic()
Dim dyn As Object = New System.Dynamic.ExpandoObject()
Dim a As String = 1 ''# Ew!
Dim obj As Object = "999"

dyn.Str = a ''# a is a string, remember? Even though it has a number
''# dyn.Str = 1 : Type = System.String
Console.WriteLine("dyn.Str = {0} : Type = {1}", dyn.Str, dyn.Str.GetType().ToString())

dyn.Num = 123
''# dyn.Num = 123 : Type = System.Int32
Console.WriteLine("dyn.Num = {0} : Type = {1}", dyn.Num, dyn.Num.GetType().ToString())

dyn.Dbl = obj / 9
''# dyn.Dbl = 111 : Type = System.Double
Console.WriteLine("dyn.Dbl = {0} : Type = {1}", dyn.Dbl, dyn.Dbl.GetType().ToString())

dyn.Obj = obj
''# dyn.Obj = 999 : Type = System.String
Console.WriteLine("dyn.Obj = {0} : Type = {1}", dyn.Obj, dyn.Obj.GetType().ToString())

dyn.Dte = #5/5/1955#
''# dyn.Dte = 7/7/1977 12:00:00 AM : Type = System.DateTime
Console.WriteLine("dyn.Dte = {0} : Type = {1}", dyn.Dte, dyn.Dte.GetType().ToString())

AmICalled(dyn.Num)
AmICalled(dyn.Obj)
AmICalled(dyn.Str)
AmICalled(dyn.Dbl)

Try
AmICalled(dyn.Dte)
Catch
Console.WriteLine("Dates don't convert to ints I guess... but we don't know that 'till runtime")
End Try

Console.WriteLine(dyn.Num + dyn.Str) ' 124!?
Console.WriteLine(dyn.Num & dyn.Str) ' 1231!?

End Sub

Private Sub AmICalled(ByVal i As Integer)
Console.WriteLine("AmICalled was called with: " & i)
End Sub

End Class

这真的正确吗?而且,如果是这样,仍然使用 ExpandoObject 之类的东西的最佳方法是什么?并降低失去所有类型安全的风险?分类?或者在这种情况下我应该不那么担心类型安全吗?

最佳答案

看来您必须关闭 Option Strict 才能做到这一点。
不过我会再研究一些。

编辑

在阅读了有关 ExpandoObject 的一些文档后,它似乎在 C# 中用于 COM 和 Office Interop。传统上,在 VB.NET 中,Object用于此类目的,这需要您关闭 Option Strict。

要回答您的问题,这意味着您可以通过使用 Object 在 VB.NET 中使用动态类型。输入而不是 ExpandoObject [如果VB.NET中存在这样的类型],设置Option Infer On选项严格开启或关闭 .
您还可以考虑使用部分类将非 Option Strict 代码本地化到特定文件。

推荐阅读

  • Dynamic Type in C#, Equivalent in VB
  • Using Type Dynamic (C# Programming Guide)
  • 关于vb.net - 带有 Option Strict On 的 VB 中的 .NET 4.0 框架动态功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3305275/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com