C# к VB.Net: Почему этому не удается скомпилировать при преобразовании в VB?

У меня есть этот дополнительный метод C#, который расширит любой словарь, где тип Значения является IList. Когда я пишу эквивалентный код в VB.Net, я получаю следующую ошибку компиляции:

"Дополнительный метод 'Добавляет', имеет некоторые ограничения типа, которые никогда не могут удовлетворяться".

Я нахожу это действительно озадачивающим, поскольку те же ограничения типа могут быть удовлетворены в 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);
}

Вот версия 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> 
<System.Runtime.CompilerServices.Extension()> _
Public Sub Add(Of KeyType, ListType As {IList(Of ValueType), New}, ValueType) _
              (ByVal thisDictionary As Dictionary(Of KeyType, ListType), ByVal key As KeyType, ByVal value As ValueType)
    'if the dictionary doesn't contain the key, make a new list under the key 
    If Not thisDictionary.ContainsKey(key) Then
        thisDictionary.Add(key, New ListType())
    End If

    'add the value to the list at the key index 
    thisDictionary(key).Add(value)
End Sub
7
задан Mark Hurd 30 August 2012 в 08:29
поделиться

3 ответа

Проблема только происходит когда <System.Runtime.CompilerServices.Extension()> присутствует. Компилятор VB вводит ограничение, что ограничения должны поддаваться проверке с одним только первым аргументом. Начиная с первого аргумента в пользу дополнительного метода (Dictionary(Of KeyType, ListType)) иждивенец на третий аргумент (ValueType) через IList(Of TValue) ограничение, это не может быть скомпилировано в VB.

5
ответ дан 7 December 2019 в 03:22
поделиться

Причина объяснена здесь: http://msdn.microsoft.com/en-us/library/bb385206.aspx

Компилятор VB мог бы быть немного более придирчивым в этом случае, потому что он должен поддерживать дополнительные параметры. (Еще) нет никаких дополнительных параметров в C#.

3
ответ дан 7 December 2019 в 03:22
поделиться

Я подозревал бы, что проблема состоит в том, что Вы использовали ValueType для в качестве названия одного из параметров типа, который является фактическим типом в библиотеке классов.NET (Система. ValueType). Я могу предположить, что C# и VB.NET обрабатывают это по-другому. Попробуйте его другим именем, как TValue (и TKey только, чтобы быть последовательными).

0
ответ дан 7 December 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: