po_saa Ответов: 1

Параметры универсального типа C# " не могут неявно преобразовать 'T' в 'int'


Привет!

Я пытаюсь понять дженерики

Вот тестовый код (это мой собственный)

Я не могу понять, почему происходит эта ошибка "Не может неявно преобразовать 'T' в 'int'"
то "левый" переменная-это определенно INT а актерский состав вроде (инт)левой не полезно
Не могли бы вы предложить
public class MyClass<t> //where T : IEnumerable<t>
{
    static Int32 iLeft;
    static string sLeft;

    public MyClass(T left)
    {
        if(typeof(T).Equals(typeof(Int32)))
        {
            <b>MyClass<t>.iLeft =left;     //the error - <b>Cannot implicitly convert 'T' as 'int'</b> </t></b>
        }
    }

    public static implicit operator MyClass<t>(T left)
    {
        return new MyClass<t>(left);
   }

    public static implicit operator Int32(MyClass<t> left)
    {
        if(left.Equals(typeof(Int32)))
        {
            return MyClass<t>.iLeft;
        }
        else
        {
            return -1;
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        MyClass<int32> r = 5;
    }
}


[edit]добавлен блок кода-OriginalGriff [/edit]

Что я уже пробовал:

Джеффри Рихтер C#, статьи в codeproject

1 Ответов

Рейтинг:
4

F-ES Sitecore

Компилятор не знает, что такое "T", поскольку это определяется вызывающим кодом - это может быть что угодно, строка, двойник, класс животных. Поэтому он не может выделить его для вашего параметра int.

Вам придется бросить "T" в int, прежде чем вы назначите его своей собственности. Однако ваш код может работать только в том случае, если "T" является int, так что это бессмысленное использование дженериков, если универсальный класс может поддерживать только один тип, вы можете вообще не использовать дженерики и использовать вместо них сильные типы.

Обновленный;

Я бы написал это примерно так, как показано ниже, однако еще раз подчеркиваю, что использование дженериков здесь немного бессмысленно. Обычно можно иметь дело с типами полностью обобщенно или иметь дело с базовыми типами, но писать исключения для каждого типа-это просто плохая практика.

public class MyClass<T>
{
    public T iLeft { get; set; }
    public string sLeft { get { return this.iLeft.ToString(); } }

    public MyClass(T left)
    {
        iLeft = left;
    }

    public static implicit operator MyClass<T>(T left)
    {
        return new MyClass<T>(left);
    }

    public static implicit operator Int32(MyClass<T> left)
    {
        if (typeof(T).Equals(typeof(Int32)))
        {
            return (int)(object)left.iLeft;
        }
        else
        {
            return -1;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass<int> r = 5;
        MyClass<int> x = 10;

        Console.WriteLine("r after creation = " + r.iLeft);
        Console.WriteLine("x after creation = " + x.iLeft);

        r = 3;

        Console.WriteLine("r after assignment = " + r.iLeft);

        int rAsInt = r;
        int xAsInt = x;

        Console.WriteLine("rAsInt = " + rAsInt);
        Console.WriteLine("xAsInt = " + xAsInt);

        int y = x * 2;

        Console.WriteLine("x * 2 = " + y);

        int z = r * x;

        Console.WriteLine("r * x as ints= " + z);

        MyClass<int> classMult = r * x;

        Console.WriteLine("r * x as MyClass<int> = " + classMult);        
        Console.ReadLine();


OriginalGriff

:большой палец вверх:

po_saa

Спасибо за ответ.
На самом деле он работает только с "int" только для учебных целей

> & gt;компилятор не знает, что такое " T"
Тем не менее во время выполнения я создаю MyClass< int>, когда объявляется "r" и конструктор MyClass правильно принимает int

Итак, не могли бы вы предложить
как исправить код? (некоторое время работать только с int)

Richard Deeming

if (typeof(T) == typeof(int))
{
   iLeft = (int)(object)left;
}

po_saa

Ух ты! отлично!
большое спасибо!

BillWoodruff

+5