Типы UInt32 и UInt64 не могут быть выведены из использования при использовании вместе с типом Int32 в универсальном метоC#

Место общения программистов C#
Ответить
Anonymous
 Типы UInt32 и UInt64 не могут быть выведены из использования при использовании вместе с типом Int32 в универсальном мето

Сообщение Anonymous »

Первоначально я столкнулся с этой проблемой, когда тестировал свой код с помощью платформы UnitTest с использованием методов Assert.AreEqual. Я заметил, что для типов UInt32 и UInt64 была выбрана другая перегрузка AreEqual (AreEqual(object, object) вместо AreEqual(T, T)). Я провел небольшое исследование и получил следующий простой код:

Код: Выделить всё

public struct MyInteger
{
public SByte SByte { get; set; }
public Byte Byte { get; set; }
public UInt16 UInt16 { get; set; }
public UInt32 UInt32 { get; set; }
public UInt64 UInt64 { get; set; }
public Int16 Int16 { get; set; }
public Int32 Int32 { get; set; }
public Int64 Int64 { get; set; }
}

public class MyGenericClass
{
public static void DoNothing(T expected, T actual)
{
}
}

public class IntegerTest
{
public void TestIntegers()
{
var integer = new MyInteger
{
SByte = 42,
Byte = 42,
Int16 = 42,
Int32 = 42,
Int64 = 42,
UInt16 = 42,
UInt32 = 42,
UInt64 = 42
};
MyGenericClass.DoNothing(42, integer.SByte); // T is Int32
MyGenericClass.DoNothing(42, integer.Byte); // T is Int32
MyGenericClass.DoNothing(42, integer.Int16); // T is Int32
MyGenericClass.DoNothing(42, integer.Int32); // T is Int32
MyGenericClass.DoNothing(42, integer.Int64); // T is Int64
MyGenericClass.DoNothing(42, integer.UInt16); // T is Int32
MyGenericClass.DoNothing(42, integer.UInt32); // Error
MyGenericClass.DoNothing(42, integer.UInt64); // Error
MyGenericClass.DoNothing((UInt32)42, integer.UInt32); // T is UInt32
MyGenericClass.DoNothing((UInt64)42, integer.UInt64); // T is UInt64
}
}
Я получаю сообщение об ошибке: «Аргументы типа для метода MyGenericClass.DoNothing(T, T)» не могут быть выведены из использования. Попробуйте указать введите аргументы явно.". Обходной путь относительно прост (используйте явное приведение), поэтому я просто хочу знать, что такого особенного в UInt32 и UInt64, каких других типов нет (или есть) и почему UInt16 ведет себя не так?
P.S. Да, чуть не забыл - я нашел эту таблицу приведения типов, но во-первых - она ​​для нового компилятора "Roslyn", а во-вторых - я все равно не вижу там ответа, может кто-то укажет на нее вышел?

Подробнее здесь: https://stackoverflow.com/questions/248 ... ong-with-i
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»