C#to VB.Net:为什么转换为VB时无法编译?

C#to VB.Net:为什么转换为VB时无法编译?,c#,vb.net,visual-studio-2008,generics,.net-3.5,C#,Vb.net,Visual Studio 2008,Generics,.net 3.5,我有一个C#扩展方法,可以扩展任何值类型为IList的字典。在VB.Net中编写等效代码时,出现以下编译错误: “扩展方法“Add”具有一些永远无法满足的类型约束” 我发现这确实令人费解,因为相同的类型约束可以在C#中得到满足 所以我的问题是:为什么这在VB中不起作用?有没有办法让这些相同类型的约束在VB中工作?我在转换代码时出错了吗?我希望有人能对这件事有所了解,因为我对这件事挠头已有一段时间了。:) (如果您好奇,扩展方法旨在简化在单个键下向字典中添加多个值(例如一个客户下的多个订单)。但这

我有一个C#扩展方法,可以扩展任何值类型为IList的字典。在VB.Net中编写等效代码时,出现以下编译错误:


“扩展方法“Add”具有一些永远无法满足的类型约束”

我发现这确实令人费解,因为相同的类型约束可以在C#中得到满足

所以我的问题是:为什么这在VB中不起作用?有没有办法让这些相同类型的约束在VB中工作?我在转换代码时出错了吗?我希望有人能对这件事有所了解,因为我对这件事挠头已有一段时间了。:)

(如果您好奇,扩展方法旨在简化在单个键下向字典中添加多个值(例如一个客户下的多个订单)。但这并不重要,我只关心我在VB中观察到的令人费解的行为)

这是一个有效的C版本:

/// <summary>
/// Adds the specified value to the multi value dictionary.
/// </summary>
/// <param name="key">The key of the element to add.</param>
/// <param name="value">The value of the element to add. The value can be null for reference types.</param>
public static void Add<KeyType, ListType, ValueType>(this Dictionary<KeyType, ListType> thisDictionary, 
                                                     KeyType key, ValueType value)
where ListType : IList<ValueType>, new()
{
    //if the dictionary doesn't contain the key, make a new list under the key
    if (!thisDictionary.ContainsKey(key))
    {
        thisDictionary.Add(key, new ListType());
    }

    //add the value to the list at the key index
    thisDictionary[key].Add(value);
}
//
///将指定的值添加到多值字典。
/// 
///要添加的元素的键。
///要添加的元素的值。对于引用类型,该值可以为null。
public static void Add(此字典),
键类型键,值类型值)
其中ListType:IList,new()
{
//如果字典不包含该键,请在该键下创建一个新列表
如果(!thisDictionary.ContainsKey(键))
{
Add(key,newlistType());
}
//将值添加到索引键处的列表中
此字典[键]。添加(值);
}
以下是未编译的VB版本:

/// <summary>
/// Adds the specified value to the multi value dictionary.
/// </summary>
/// <param name="key">The key of the element to add.</param>
/// <param name="value">The value of the element to add. The value can be null for reference types.</param>
public static void Add<KeyType, ListType, ValueType>(this Dictionary<KeyType, ListType> thisDictionary, 
                                                     KeyType key, ValueType value)
where ListType : IList<ValueType>, new()
{
    //if the dictionary doesn't contain the key, make a new list under the key
    if (!thisDictionary.ContainsKey(key))
    {
        thisDictionary.Add(key, new ListType());
    }

    //add the value to the list at the key index
    thisDictionary[key].Add(value);
}
“”
''将指定的值添加到多值字典中。
'''  
''要添加的元素的键。
''要添加的元素的值。对于引用类型,该值可以为null。
_
Public Sub Add(属于KeyType,ListType为{IList(属于ValueType),New},ValueType)_
(ByVal thisDictionary作为字典(属于KeyType,ListType),ByVal key作为KeyType,ByVal value作为ValueType)
'如果字典不包含该键,请在该键下创建一个新列表
如果不是这本字典,那么包含键
thisDictionary.Add(键,New ListType())
如果结束
'将值添加到索引键处的列表中
此字典(键)。添加(值)
端接头

我怀疑问题在于您使用的ValueType作为一个类型参数的名称,它是.NET类库(System.ValueType)中的实际类型。我可以想象C#和VB.NET处理这个问题的方式是不同的。请尝试使用不同的名称,如TValue(和TKey,只是为了保持一致)。

原因如下:


在这种情况下,VB编译器可能会有点挑剔,因为它必须支持可选参数。C#(尚未)中没有可选参数。

只有当存在
时,问题才会发生。
VB编译器施加了一个限制,即约束必须仅通过第一个参数进行验证。由于扩展方法的第一个参数(
Dictionary(属于KeyType,ListType)
)依赖于第三个参数(
ValueType
)通过
IList(属于TValue)
约束,因此无法在VB中编译该参数。

请注意,有一点不同:

“”
''将指定的值添加到多值字典中。
'''  
''要添加的元素的键。
''要添加的元素的值。对于引用类型,该值可以为null。
_
Public Sub Add(属于KeyType,ListType为{New,IList(属于ValueType)},ValueType)_
(ByVal thisDictionary作为字典(属于KeyType,IList(属于ValueType)),ByVal key作为KeyType,ByVal value作为ValueType)
'如果字典不包含该键,请在该键下创建一个新列表
如果不是这本字典,那么包含键
thisDictionary.Add(键,New ListType())
如果结束
'将值添加到索引键处的列表中
此字典(键)。添加(值)
端接头

您可以让
字典
包含
列表类型
列表,但它必须声明为
(Of…,IList(Of…)

它给出了什么错误?“扩展方法'Add'具有一些永远无法满足的类型约束”.我已尝试按照您的建议更改类型参数的名称,但没有任何区别。好主意。奇怪的是,他们在VB中有这个限制,但在C#中没有。这是一种突出VB和C拥有不同开发团队的情况。这不会导致
New ListType()
调用失败吗?我们丢失了指定ListType必须具有公共无参数构造函数的约束。@DoctaJonez否,
ListType作为{New,IList(Of ValueType)}
约束仍然存在。我编译了这段代码,但没有测试它。当然!我没有正确地阅读它,我指责VB语法突出显示没有很好地工作!;-)