2013-08-19 2 views
4

У меня есть класс с двумя типичными параметрами. Я хочу ограничить второй общий параметр другим типом, чем первый. Есть ли способ сделать такое ограничение во время компиляции? Проверка типов во время выполнения не очень полезна.Общие параметры: обеспечить различные типы

public class Test<A, B> 
    where B : not_typeof(A) 
{ 
    // ... 
} 
+0

В самом деле, это немного другой сценарий, но в конечном счете это тот же ответ, как один @ Сэм ссылки на –

+0

Есть ли у вас другие ограничения? Потому что, когда у вас есть 'где A: IUtensil', где B: IVehicle', почему вас это волнует, если у пользователя есть« Test »? Он должен работать ... Не могли бы вы добавить некоторые подробности? – Kobi

+0

Вы не можете написать ограничение, подобное этому, но, конечно, вы можете использовать другие ограничения, которые гарантируют, что типы не могут быть одинаковыми, например, если 'A' должен выводиться из класса' Animal' и 'B' должен происходить из класса «Велосипед», и если ни один из этих двух классов не вытекает из другого, тогда вы будете знать, что «A» и «B» не могут быть одного типа, например, подсказки @Kobi. Точно так же, если у вас есть ограничение 'struct' (тип с нечетным значением), а у другого есть ограничение' class' (ссылочный тип). –

ответ

4

Единственный способ - во время выполнения.

Я адаптировал ответ из answer. Я разместил в комментариях.

public class Test<A, B> { 

    static Test() { 
     if (typeof(B) == typeof(A)) { 
      throw new NotSupportedException("Argument B is not supported."); 
     } 
    } 
} 
+0

Это решение, с которым я сейчас работаю. Он работает, но это противно, потому что вы видите только свою ошибку во время выполнения. Я искал решение, работающее во время компиляции. Однако я буду отмечать ваш пост как ответ, потому что кажется, что (в настоящее время) нет способа сделать такое ограничение во время компиляции. – Shinja