C# 如何从C中的方法返回VB6变量类型的等效项#

C# 如何从C中的方法返回VB6变量类型的等效项#,c#,vb6,variant,C#,Vb6,Variant,我有一个旧的VB6应用程序,它有一个函数RunReturningVAR,它是一个db调用,可以返回一个int,string,double。。。。。但不是记录集。它是以非常通用的方式构建的,因此它可以被多个其他函数调用,因此我们没有多个位置用于DB调用。 我现在拥有的是附件 Public Function RunReturningVar(ByVal vstrSql As String, _ Optional ByVal connval As Boolean = False, _ Optional

我有一个旧的VB6应用程序,它有一个函数RunReturningVAR,它是一个db调用,可以返回一个
int
string
double
。。。。。但不是
记录集
。它是以非常通用的方式构建的,因此它可以被多个其他函数调用,因此我们没有多个位置用于DB调用。 我现在拥有的是附件

Public Function RunReturningVar(ByVal vstrSql As String, _
Optional ByVal connval As Boolean = False, _
Optional ByVal copyID As Double = 0, _
Optional ByVal corpVal As Boolean = False, _
Optional ByVal vintConnectionTimeout As Integer = 30) As Variant
VB6(真不敢相信我找到了那个链接!)翻译成c

它几乎可以转换为
对象
,但
变量
是特定于 后期绑定,并且它可以保存引用类型和值类型-不像c#
对象
只能通过装箱保存值类型

请注意,使用
dynamic
意味着您绕过了所有编译时类型检查,这可能导致您通常不希望从c#程序中看到的运行时错误

或许可以更好地使用泛型,但这需要您从调用方法中指定返回类型:

public T RunReturningVar<T>(
    string vstrSql, 
    bool connval = false,
    double copyID = 0,
    bool corpVal = false,
    int vintConnectionTimeout = 30) where T : new()
{
    // do your stuff here and return T
}
c#编译器实际上将其转换为:

yourObjectReference.RunReturningVar(sql, true, 0, false, 30);
这意味着,如果要更改任何参数的默认值,也应重新编译引用此参数的其他程序集。 因此,更好的选择是使用方法重载:

public dynamic RunReturningVar(
    string vstrSql, 
    bool connval,
    double copyID,
    bool corpVal,
    int vintConnectionTimeout) 
{
    // do your stuff here 
}

public dynamic RunReturningVar(
    string vstrSql, 
    bool connval,
    double copyID,
    bool corpVal
    ) 
{
    return RunReturningVar(vstrSql, connval, copyID, corpVal, 30);
}

public dynamic RunReturningVar(
    string vstrSql, 
    bool connval,
    double copyID,
    ) 
{
    return RunReturningVar(vstrSql, connval, copyID, false);
}

依此类推。

没有附加任何内容,但您可以返回一个
对象,它是一个变体。对不起,现在我的问题是为什么,哦,为什么,这个标记为c#?@rory.ap您读过这个问题吗?@rory.ap是的,他们只说过一次,他们试图将VB代码写入c#。为什么他们需要说不止一次?关于C#如何处理可选参数,这很有趣。Dear downvoter:你能留下一条评论,说明我的答案有什么问题吗?哇,非常感谢你提供可选参数的信息。我不知道。@LeeHopkins我想很多开发者都不知道。在我使用c#的第一年,我对此一无所知,我只是碰巧在stackoverflow上看到了它的解释(但不记得很久以前在哪里)。因此,我觉得应该有更多的人知道这一点,如果我回答一个关于具有可选参数的代码的问题,我会提到这一点(但大多数情况下,更简短地说)
yourObjectReference.RunReturningVar(sql, true, 0, false, 30);
public dynamic RunReturningVar(
    string vstrSql, 
    bool connval,
    double copyID,
    bool corpVal,
    int vintConnectionTimeout) 
{
    // do your stuff here 
}

public dynamic RunReturningVar(
    string vstrSql, 
    bool connval,
    double copyID,
    bool corpVal
    ) 
{
    return RunReturningVar(vstrSql, connval, copyID, corpVal, 30);
}

public dynamic RunReturningVar(
    string vstrSql, 
    bool connval,
    double copyID,
    ) 
{
    return RunReturningVar(vstrSql, connval, copyID, false);
}