Наследование в родовых типах - PullRequest
0 голосов
/ 22 сентября 2010

Может ли кто-нибудь помочь мне в использовании Где для универсальных типов?Я пытался создать функцию, которая выполняет ST с числом типа double или int, поэтому я сказал, что это должна быть универсальная функция.Но когда я пытаюсь присвоить значение переменным этого универсального типа, я не могу, потому что это не числовой тип.Кроме того, я не могу использовать Где наследовать универсальный тип от типа int или double.

Вот код:
public static T[,] Unit(int n) where T : PROBLEM<br> { </p> <pre><code> T[,] mat = new T[n, n]; for (int i = 0; i < n; i++) mat[i, i] = (T)1; return mat;

}

Кто-нибудь может помочь?

Ответы [ 4 ]

1 голос
/ 22 сентября 2010

Система ограничений в Generics по-прежнему довольно грубая. Это все еще тупой инструмент с относительно небольшим количеством опций на выбор. Гораздо более богатый набор функций для выражения ограничений на параметры типа позволит разрабатывать всевозможные сложные алгоритмы, такие как программирование на основе шаблонов и т. Д.

Если вы только скажете мне, что T - это футболка, на которую я смотрю ... я не могу с этим ничего поделать. Но если T - это не только футболка, но на самом деле его носит гудок с некоторыми свойствами int [] со счетчиками в верхних 30-х годах и определенными событиями, на которые я могу подписаться и обрабатывать с помощью пользовательских кодов, тогда я думаю, что это сделает программирование немного более увлекательным и живой.

1 голос
/ 22 сентября 2010

Не уверен, что это «Где», на которое вы ссылаетесь, но вы можете объявить свою обобщенную функцию как

public T Calculate<T>(T x, T y) where T : IComparable<T>
{
    // do calculations
}

Я считаю, int и double оба реализуют IComparable<T>.

1 голос
/ 22 сентября 2010

К сожалению, одним из недостатков C # является то, что вы не можете легко создавать универсальные числовые алгоритмы. Вы можете взломать его, например, используя этот пример из MSDN:

public abstract class BaseCalculator<T>
{
   public abstract T Add(T arg1,T arg2);
   public abstract T Subtract(T arg1,T arg2);
   public abstract T Divide(T arg1,T arg2);
   public abstract T Multiply(T arg1,T arg2);
}
public class IntCalculator : BaseCalculator<int>
{
   public override int Add(int arg1, int arg2)
   {
      return arg1 + arg2;
   }
   //Rest of the methods 
} 

Но, вообще говоря, библиотеки .Net просто имеют отдельную реализацию для такого рода вещей, а не пытаются использовать дженерики.

0 голосов
/ 22 сентября 2010

Вы можете ограничить свой параметр универсального типа как struct .Struct представляет тип значения типа int или double.Вот пример из статьи MSDN:

public class MyClass<T> where T : struct 

{...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...