C# 4.0 C#泛型-是否可以对方法施加约束,使其仅接受DataTable和String?

C# 4.0 C#泛型-是否可以对方法施加约束,使其仅接受DataTable和String?,c#-4.0,generics,C# 4.0,Generics,我想这样做: public void MyMethod<T>(T myArg) where T: DataTable, String { ... } public void MyMethod(T myArg),其中T:DataTable,String { ... } 这是可能的吗?最好将其设为两种不同的方法 public void MyMethod(DataTable myArg) { ... } public void MyMethod(String myAr

我想这样做:

public void MyMethod<T>(T myArg) where T: DataTable, String
{
    ...
}
public void MyMethod(T myArg),其中T:DataTable,String
{
...
}

这是可能的吗?

最好将其设为两种不同的方法

public void MyMethod(DataTable myArg)
{
    ...
}

public void MyMethod(String myArg)
{
    ...
}
或者,如果是泛型的(我不确定为什么在这种情况下需要泛型)

公共void MyMethod(T myArg),其中T:DataTable
{
...
}
public void MyMethodStr(T myArg),其中T:string
{
...
}
或者更糟糕的情况是,如果不是这些类型之一,则抛出错误。这是最不可取的,因为它将在运行时抛出而不是编译

public void MyMethod<T>(T myArg)
{
    if(myArg is String == false && myString is DataTable == false)
        throw new InvalidArgumentException(...);
}
public void MyMethod(T myArg)
{
if(myArg是String==false&&myString是DataTable==false)
抛出新的InvalidArgumentException(…);
}

但是除此之外,没有。

对于编译器来说,这没有什么意义——它怎么知道传入了哪一个呢?您能解释一下这种方法的用例是什么吗?查询还是数据表;如果是查询,我创建自己的datatable,如果是datatable,我处理数据。看起来我应该有两个方法,但这很难看,我不能用相同数量的参数,但不同类型的重载。所以它可能类似于MyMethodUsingString()或MyMethodUsingDataTable()。这可能(对你来说)很难看,但这是正确的解决办法。你在这里不是真的在使用泛型(或者更确切地说,你在滥用它们)。为什么它们不能是不同类型的不同方法呢?@Oded,我同意你的看法。如果我要使用不同的方法,我不需要使它们泛型。另外,根据我收集的信息,你不能将字符串作为约束。哦,你也不能有具有相同数量参数的重载,所以你的第一个想法是行不通的。。但是,我可以使用MyMethodString(string arg)和MyMethodDataTable(DataTable arg)。它们不可能是同一类型的。
public void MyMethod<T>(T myArg)
{
    if(myArg is String == false && myString is DataTable == false)
        throw new InvalidArgumentException(...);
}