Single.Equals Метод

Определение

Возвращает значение, указывающее, представляют ли два экземпляра Single одного и того же значения.

Перегрузки

Имя Описание
Equals(Object)

Возвращает значение, указывающее, равен ли этот экземпляр указанному объекту.

Equals(Single)

Возвращает значение, указывающее, представляет ли этот экземпляр и указанный Single объект одинаковые значения.

Equals(Object)

Исходный код:
Single.cs
Исходный код:
Single.cs
Исходный код:
Single.cs
Исходный код:
Single.cs
Исходный код:
Single.cs

Возвращает значение, указывающее, равен ли этот экземпляр указанному объекту.

public:
 override bool Equals(System::Object ^ obj);
public override bool Equals(object obj);
public override bool Equals(object? obj);
override this.Equals : obj -> bool
Public Overrides Function Equals (obj As Object) As Boolean

Параметры

obj
Object

Объект для сравнения с этим экземпляром.

Возвращаемое значение

true Значение , если obj является экземпляром Single и равно значению этого экземпляра; в противном случае false.

Примеры

В следующем примере кода демонстрируется Equals метод.

obj1 = (Single)500;
if (a.Equals(obj1)) {
    Console.WriteLine("The value type and reference type values are equal.");
}
let obj1 = single 500
if a.Equals obj1 then
    printfn "The value type and reference type values are equal."
Obj1 = CType(500, Single)

If A.Equals(Obj1) Then
    Console.WriteLine("The value type and reference type values are equal.")
End If

Комментарии

Метод Equals следует использовать с осторожностью, так как два по-видимому эквивалентных значения могут быть неравными из-за разной точности двух значений. В следующем примере сообщается, что значение Single равное 0.3333 и значение Single, возвращаемое путем деления 1 на 3, не равны.

// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = 1/3;
// Compare them for equality
Console.WriteLine(float1.Equals(float2));    // displays false
// Initialize two floats with apparently identical values
let float1 = 0.33333f
let float2 = box (1f / 3f)
// Compare them for equality
printfn $"{float1.Equals float2}"    // displays false
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Object = 1/3
' Compare them for equality
Console.WriteLine(single1.Equals(single2))    ' displays False

Вместо сравнения равенства рекомендуется определить допустимое поле разницы между двумя значениями (например, 01% одного из значений). Если абсолютное значение разницы между двумя значениями меньше или равно этому порогу, разница, вероятно, вызвана различиями в точности и, следовательно, значения, вероятно, равны. В следующем примере используется этот метод для сравнения .33333 и 1/3, два значения Single, которые предыдущий пример кода обнаружил как неравные.

// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = (float) 1/3;
// Define the tolerance for variation in their values
float difference = Math.Abs(float1 * .0001f);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(float1 - (float) float2) <= difference)
   Console.WriteLine("float1 and float2 are equal.");
else
   Console.WriteLine("float1 and float2 are unequal.");
// Initialize two floats with apparently identical values
let float1 = 0.33333f
let float2 = box (1f / 3f)
// Define the tolerance for variation in their values
let difference = abs (float1 * 0.0001f)

// Compare the values
// The output to the console indicates that the two values are equal
if abs (float1 - (float2 :?> float32)) <= difference then
    printfn "float1 and float2 are equal."
else
    printfn "float1 and float2 are unequal."
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Object = 1/3
' Define the tolerance for variation in their values
Dim difference As Single = Math.Abs(single1 * .0001f)

' Compare the values
' The output to the console indicates that the two values are equal
If Math.Abs(single1 - CSng(single2)) <= difference Then
   Console.WriteLine("single1 and single2 are equal.")
Else
   Console.WriteLine("single1 and single2 are unequal.")
End If

В этом случае значения равны.

Note

Так как Epsilon определяет минимальное выражение положительного значения, диапазон которого близок к нулю, поле разницы должно быть больше Epsilon. Как правило, это много раз больше Epsilon.

Точность чисел с плавающей запятой за пределами документированного значения зависит от реализации и версии платформы .NET Framework. Следовательно, сравнение двух конкретных чисел может измениться между версиями .NET Framework, так как точность внутреннего представления чисел может измениться.

Примечания для тех, кто вызывает этот метод

Разрешение перегрузки компилятора может учитывать очевидное различие в поведении двух Equals(Object) перегрузок метода. Если неявное преобразование между obj аргументом и Single аргументом не Objectзадано, компиляторы могут выполнять неявное преобразование и вызывать Equals(Single) метод. В противном случае они вызывают Equals(Object) метод, который всегда возвращается false , если его obj аргумент не является значением Single . В следующем примере показано различие в поведении между двумя перегрузками методов. В случае всех примитивных числовых типов, за исключением Double в Visual Basic и за исключением Decimal и Double в C#, Первое сравнение возвращает значение true, так как компилятор автоматически выполняет расширение преобразования и вызывает метод Equals(Single), а второе сравнение возвращает false, так как компилятор вызывает метод Equals(Object).

using System;

public class Example2
{
   static float value = 112;

   public static void Main()
   {
      byte byte1= 112;
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1));
      TestObjectForEquality(byte1);

      short short1 = 112;
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1));
      TestObjectForEquality(short1);

      int int1 = 112;
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1));
      TestObjectForEquality(int1);

      long long1 = 112;
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1));
      TestObjectForEquality(long1);

      sbyte sbyte1 = 112;
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1));
      TestObjectForEquality(sbyte1);

      ushort ushort1 = 112;
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1));
      TestObjectForEquality(ushort1);

      uint uint1 = 112;
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1));
      TestObjectForEquality(uint1);

      ulong ulong1 = 112;
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1));
      TestObjectForEquality(ulong1);

      decimal dec1 = 112m;
      Console.WriteLine("value = dec1: {0,21}", value.Equals(dec1));
      TestObjectForEquality(dec1);

      double dbl1 = 112;
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1));
      TestObjectForEquality(dbl1);
   }

   private static void TestObjectForEquality(Object obj)
   {
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}\n",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj));
   }
}
// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False
let value = 112f

let testObjectForEquality (obj: obj) =
    printfn $"{value} ({value.GetType().Name}) = {obj} ({obj.GetType().Name}): {value.Equals obj}\n"

[<EntryPoint>]
let main _ =
    let byte1= 112uy
    printfn $"value = byte1: {value.Equals byte1,16}"
    testObjectForEquality byte1

    let short1 = 112s
    printfn $"value = short1: {value.Equals short1,16}"
    testObjectForEquality short1

    let int1 = 112
    printfn $"value = int1: {value.Equals int1,18}"
    testObjectForEquality int1

    let long1 = 112L
    printfn $"value = long1: {value.Equals long1,17}"
    testObjectForEquality long1
    
    let sbyte1 = 112y
    printfn $"value = sbyte1: {value.Equals sbyte1,16}"
    testObjectForEquality sbyte1

    let ushort1 = 112us
    printfn $"value = ushort1: {value.Equals ushort1,16}"
    testObjectForEquality ushort1

    let uint1 = 112u
    printfn $"value = uint1: {value.Equals uint1,18}"
    testObjectForEquality uint1

    let ulong1 = 112uL
    printfn $"value = ulong1: {value.Equals ulong1,17}"
    testObjectForEquality ulong1
    
    let dec1 = 112m
    printfn $"value = dec1: {value.Equals dec1,21}"
    testObjectForEquality dec1

    let dbl1 = 112.
    printfn $"value = dbl1: {value.Equals dbl1,20}"
    testObjectForEquality dbl1
    0

// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False
Module Example2
   Dim value As Single = 112

   Public Sub Main()
      Dim byte1 As Byte = 112
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1))
      TestObjectForEquality(byte1)

      Dim short1 As Short = 112
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1))
      TestObjectForEquality(short1)

      Dim int1 As Integer = 112
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1))
      TestObjectForEquality(int1)

      Dim long1 As Long = 112
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1))
      TestObjectForEquality(long1)

      Dim sbyte1 As SByte = 112
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1))
      TestObjectForEquality(sbyte1)

      Dim ushort1 As UShort = 112
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1))
      TestObjectForEquality(ushort1)

      Dim uint1 As UInteger = 112
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1))
      TestObjectForEquality(uint1)

      Dim ulong1 As ULong = 112
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1))
      TestObjectForEquality(ulong1)

      Dim dec1 As Decimal = 112d
      Console.WriteLine("value = dec1: {0,20}", value.Equals(dec1))
      TestObjectForEquality(dec1)

      Dim dbl1 As Double = 112
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1))
      TestObjectForEquality(dbl1)
   End Sub

   Private Sub TestObjectForEquality(obj As Object)
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj))
      Console.WriteLine()
   End Sub
End Module
' The example displays the following output:
'       value = byte1:             True
'       112 (Single) = 112 (Byte): False
'
'       value = short1:             True
'       112 (Single) = 112 (Int16): False
'
'       value = int1:               True
'       112 (Single) = 112 (Int32): False
'
'       value = long1:              True
'       112 (Single) = 112 (Int64): False
'
'       value = sbyte1:             True
'       112 (Single) = 112 (SByte): False
'
'       value = ushort1:             True
'       112 (Single) = 112 (UInt16): False
'
'       value = uint1:               True
'       112 (Single) = 112 (UInt32): False
'
'       value = ulong1:              True
'       112 (Single) = 112 (UInt64): False
'
'       value = dec1:                 True
'       112 (Single) = 112 (Decimal): False
'
'       value = dbl1:                False
'       112 (Single) = 112 (Double): False

См. также раздел

Применяется к

Equals(Single)

Исходный код:
Single.cs
Исходный код:
Single.cs
Исходный код:
Single.cs
Исходный код:
Single.cs
Исходный код:
Single.cs

Возвращает значение, указывающее, представляет ли этот экземпляр и указанный Single объект одинаковые значения.

public:
 virtual bool Equals(float obj);
public bool Equals(float obj);
override this.Equals : single -> bool
Public Function Equals (obj As Single) As Boolean

Параметры

obj
Single

Объект для сравнения с этим экземпляром.

Возвращаемое значение

true Значение , если obj равно этому экземпляру; в противном случае false.

Реализации

Комментарии

Метод Single.Equals(Single) реализует интерфейс System.IEquatable<T> и выполняет немного лучше, чем Single.Equals(Object), так как не требуется преобразовать параметр obj в объект.

Расширение преобразований

В зависимости от языка программирования можно закодировать метод Equals, где тип параметра имеет меньше битов (является более узким), чем тип экземпляра. Это возможно, так как некоторые языки программирования выполняют неявное расширение типа, представляющее параметр как тип с таким же количеством битов, как и у экземпляра.

Например, представим, что тип экземпляра — Single, а тип параметра — Int32. Компилятор Microsoft C# создает инструкции для представления значения параметра в виде объекта Single, а затем создает метод Single.Equals(Single), который сравнивает значения экземпляра и расширенный представление параметра.

Ознакомьтесь с документацией по языку программирования, чтобы определить, выполняет ли компилятор неявное расширение преобразований числовых типов. Дополнительные сведения см. в таблицах преобразования типов .

Точность сравнения

Метод Equals следует использовать с осторожностью, так как два по-видимому эквивалентных значения могут быть неравными из-за разной точности двух значений. В следующем примере сообщается, что значение Single равное 0.3333 и значение Single, возвращаемое путем деления 1 на 3, не равны.

// Initialize two floats with apparently identical values
float float1 = .33333f;
float float2 = 1/3;
// Compare them for equality
Console.WriteLine(float1.Equals(float2));    // displays false
// Initialize two floats with apparently identical values
let float1 = 0.33333f
let float2 = 1f / 3f
// Compare them for equality
printfn $"{float1.Equals float2}"    // displays false
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Single = 1/3
' Compare them for equality
Console.WriteLine(single1.Equals(single2))    ' displays False

Один метод сравнения, который избегает проблем, связанных с сравнением равенства, включает определение допустимого поля разницы между двумя значениями (например, 01% одного из значений). Если абсолютное значение разницы между двумя значениями меньше или равно этой границе, разница, скорее всего, связана с различиями в точности и, следовательно, значения вероятно равны. В следующем примере используется этот метод для сравнения .33333 и 1/3, которые являются двумя значениями Single, неравными в предыдущем примере кода.

// Initialize two floats with apparently identical values
float float1 = .33333f;
float float2 = (float) 1/3;
// Define the tolerance for variation in their values
float difference = Math.Abs(float1 * .0001f);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(float1 - float2) <= difference)
   Console.WriteLine("float1 and float2 are equal.");
else
   Console.WriteLine("float1 and float2 are unequal.");
// Initialize two floats with apparently identical values
let float1 = 0.33333f
let float2 = 1f / 3f
// Define the tolerance for variation in their values
let difference = abs (float1 * 0.0001f)

// Compare the values
// The output to the console indicates that the two values are equal
if abs (float1 - float2) <= difference then
    printfn "float1 and float2 are equal."
else
    printfn "float1 and float2 are unequal."
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Single = 1/3
' Define the tolerance for variation in their values
Dim difference As Single = Math.Abs(single1 * .0001f)

' Compare the values
' The output to the console indicates that the two values are equal
If Math.Abs(single1 - single2) <= difference Then
   Console.WriteLine("single1 and single2 are equal.")
Else
   Console.WriteLine("single1 and single2 are unequal.")
End If

В этом случае значения равны.

Note

Так как Epsilon определяет минимальное выражение положительного значения, диапазон которого близок к нулю, поле разницы должно быть больше Epsilon. Как правило, это много раз больше Epsilon. В связи с этим мы рекомендуем не использовать Epsilon при сравнении значений Double на равенство.

Второй метод, который избегает проблем, связанных с сравнением равенства, включает сравнение разницы между двумя числами с плавающей запятой с некоторым абсолютным значением. Если разница меньше или равна абсолютному значению, числа равны. Если первое число больше, числа не равны. Один из способов сделать это — произвольно выбрать абсолютное значение. Однако это проблематично, так как допустимое поле разницы зависит от величины Single значений. Второй способ использует функцию конструктора формата с плавающей запятой: разница между компонентами мантисса в целых представлениях двух значений с плавающей запятой указывает количество возможных значений с плавающей запятой, разделяющих два значения. Например, разница между 0,0 и Epsilon составляет 1, потому что Epsilon является наименьшим представляемым значением при работе с Single, значение которого равно нулю. В следующем примере используется этот метод для сравнения .33333 и 1/3, которые являются двумя значениями Double, которые предыдущий пример кода с методом Equals(Single) нашел неравными. Обратите внимание, что в примере используются методы BitConverter.GetBytes и BitConverter.ToInt32 для преобразования значения с плавающей запятой с одной точностью в целочисленное представление.

using System;

public class Example
{
   public static void Main()
   {
      float value1 = .1f * 10f;
      float value2 = 0f;
      for (int ctr = 0; ctr < 10; ctr++)
         value2 += .1f;
         
      Console.WriteLine($"{value1:R} = {value2:R}: {HasMinimalDifference(value1, value2, 1)}");
   }

   public static bool HasMinimalDifference(float value1, float value2, int units)
   {
      byte[] bytes = BitConverter.GetBytes(value1);
      int iValue1 = BitConverter.ToInt32(bytes, 0);
      
      bytes = BitConverter.GetBytes(value2);
      int iValue2 = BitConverter.ToInt32(bytes, 0);
      
      // If the signs are different, return false except for +0 and -0.
      if ((iValue1 >> 31) != (iValue2 >> 31))
      {
         if (value1 == value2)
            return true;
          
         return false;
      }

      int diff = Math.Abs(iValue1 - iValue2);

      if (diff <= units)
         return true;

      return false;
   }
}
// The example displays the following output:
//        1 = 1.00000012: True
open System

let hasMinimalDifference (value1: float32) (value2: float32) units =
    let bytes = BitConverter.GetBytes value1
    let iValue1 = BitConverter.ToInt32(bytes, 0)
    let bytes = BitConverter.GetBytes(value2)
    let iValue2 = BitConverter.ToInt32(bytes, 0)
    
    // If the signs are different, return false except for +0 and -0.
    if (iValue1 >>> 31) <> (iValue2 >>> 31) then
        value1 = value2
    else
        let diff = abs (iValue1 - iValue2)
        diff <= units

let value1 = 0.1f * 10f
let value2 =
    List.replicate 10 0.1f
    |> List.sum
    
printfn $"{value1:R} = {value2:R}: {hasMinimalDifference value1 value2 1}"
// The example displays the following output:
//        1 = 1.0000001: True
Module Example1
   Public Sub Main()
      Dim value1 As Single = .1 * 10
      Dim value2 As Single = 0
      For ctr As Integer =  0 To 9
         value2 += CSng(.1)
      Next

      Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2,
                        HasMinimalDifference(value1, value2, 1))
   End Sub

   Public Function HasMinimalDifference(value1 As Single, value2 As Single, units As Integer) As Boolean
      Dim bytes() As Byte = BitConverter.GetBytes(value1)
      Dim iValue1 As Integer =  BitConverter.ToInt32(bytes, 0)

      bytes = BitConverter.GetBytes(value2)
      Dim iValue2 As Integer =  BitConverter.ToInt32(bytes, 0)

      ' If the signs are different, Return False except for +0 and -0.
      If ((iValue1 >> 31) <> (iValue2 >> 31)) Then
         If value1 = value2 Then
            Return True
         End If
         Return False
      End If

      Dim diff As Integer =  Math.Abs(iValue1 - iValue2)

      If diff <= units Then
         Return True
      End If

      Return False
   End Function
End Module
' The example displays the following output:
'       1 = 1.00000012: True

Точность чисел с плавающей запятой за пределами документированной точности зависит от реализации и версии .NET. Следовательно, сравнение двух чисел может привести к разным результатам в зависимости от версии .NET, так как точность внутреннего представления чисел может измениться.

Примечания для тех, кто вызывает этот метод

Разрешение перегрузки компилятора может учитывать очевидное различие в поведении двух Equals(Object) перегрузок метода. Если неявное преобразование между obj аргументом и Single аргументом не Objectзадано, компиляторы могут выполнять неявное преобразование и вызывать Equals(Single) метод. В противном случае они вызывают Equals(Object) метод, который всегда возвращается false , если его obj аргумент не является значением Single . В следующем примере показано различие в поведении между двумя перегрузками методов. В случае всех примитивных числовых типов, за исключением Double в Visual Basic и за исключением Decimal и Double в C#, Первое сравнение возвращает значение true, так как компилятор автоматически выполняет расширение преобразования и вызывает метод Equals(Single), а второе сравнение возвращает false, так как компилятор вызывает метод Equals(Object).

using System;

public class Example2
{
   static float value = 112;

   public static void Main()
   {
      byte byte1= 112;
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1));
      TestObjectForEquality(byte1);

      short short1 = 112;
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1));
      TestObjectForEquality(short1);

      int int1 = 112;
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1));
      TestObjectForEquality(int1);

      long long1 = 112;
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1));
      TestObjectForEquality(long1);

      sbyte sbyte1 = 112;
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1));
      TestObjectForEquality(sbyte1);

      ushort ushort1 = 112;
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1));
      TestObjectForEquality(ushort1);

      uint uint1 = 112;
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1));
      TestObjectForEquality(uint1);

      ulong ulong1 = 112;
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1));
      TestObjectForEquality(ulong1);

      decimal dec1 = 112m;
      Console.WriteLine("value = dec1: {0,21}", value.Equals(dec1));
      TestObjectForEquality(dec1);

      double dbl1 = 112;
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1));
      TestObjectForEquality(dbl1);
   }

   private static void TestObjectForEquality(Object obj)
   {
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}\n",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj));
   }
}
// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False
let value = 112f

let testObjectForEquality (obj: obj) =
    printfn $"{value} ({value.GetType().Name}) = {obj} ({obj.GetType().Name}): {value.Equals obj}\n"

[<EntryPoint>]
let main _ =
    let byte1= 112uy
    printfn $"value = byte1: {value.Equals byte1,16}"
    testObjectForEquality byte1

    let short1 = 112s
    printfn $"value = short1: {value.Equals short1,16}"
    testObjectForEquality short1

    let int1 = 112
    printfn $"value = int1: {value.Equals int1,18}"
    testObjectForEquality int1

    let long1 = 112L
    printfn $"value = long1: {value.Equals long1,17}"
    testObjectForEquality long1
    
    let sbyte1 = 112y
    printfn $"value = sbyte1: {value.Equals sbyte1,16}"
    testObjectForEquality sbyte1

    let ushort1 = 112us
    printfn $"value = ushort1: {value.Equals ushort1,16}"
    testObjectForEquality ushort1

    let uint1 = 112u
    printfn $"value = uint1: {value.Equals uint1,18}"
    testObjectForEquality uint1

    let ulong1 = 112uL
    printfn $"value = ulong1: {value.Equals ulong1,17}"
    testObjectForEquality ulong1
    
    let dec1 = 112m
    printfn $"value = dec1: {value.Equals dec1,21}"
    testObjectForEquality dec1

    let dbl1 = 112.
    printfn $"value = dbl1: {value.Equals dbl1,20}"
    testObjectForEquality dbl1
    0

// The example displays the following output:
//       value = byte1:             True
//       112 (Single) = 112 (Byte): False
//
//       value = short1:             True
//       112 (Single) = 112 (Int16): False
//
//       value = int1:               True
//       112 (Single) = 112 (Int32): False
//
//       value = long1:              True
//       112 (Single) = 112 (Int64): False
//
//       value = sbyte1:             True
//       112 (Single) = 112 (SByte): False
//
//       value = ushort1:             True
//       112 (Single) = 112 (UInt16): False
//
//       value = uint1:               True
//       112 (Single) = 112 (UInt32): False
//
//       value = ulong1:              True
//       112 (Single) = 112 (UInt64): False
//
//       value = dec1:                 False
//       112 (Single) = 112 (Decimal): False
//
//       value = dbl1:                False
//       112 (Single) = 112 (Double): False
Module Example2
   Dim value As Single = 112

   Public Sub Main()
      Dim byte1 As Byte = 112
      Console.WriteLine("value = byte1: {0,16}", value.Equals(byte1))
      TestObjectForEquality(byte1)

      Dim short1 As Short = 112
      Console.WriteLine("value = short1: {0,16}", value.Equals(short1))
      TestObjectForEquality(short1)

      Dim int1 As Integer = 112
      Console.WriteLine("value = int1: {0,18}", value.Equals(int1))
      TestObjectForEquality(int1)

      Dim long1 As Long = 112
      Console.WriteLine("value = long1: {0,17}", value.Equals(long1))
      TestObjectForEquality(long1)

      Dim sbyte1 As SByte = 112
      Console.WriteLine("value = sbyte1: {0,16}", value.Equals(sbyte1))
      TestObjectForEquality(sbyte1)

      Dim ushort1 As UShort = 112
      Console.WriteLine("value = ushort1: {0,16}", value.Equals(ushort1))
      TestObjectForEquality(ushort1)

      Dim uint1 As UInteger = 112
      Console.WriteLine("value = uint1: {0,18}", value.Equals(uint1))
      TestObjectForEquality(uint1)

      Dim ulong1 As ULong = 112
      Console.WriteLine("value = ulong1: {0,17}", value.Equals(ulong1))
      TestObjectForEquality(ulong1)

      Dim dec1 As Decimal = 112d
      Console.WriteLine("value = dec1: {0,20}", value.Equals(dec1))
      TestObjectForEquality(dec1)

      Dim dbl1 As Double = 112
      Console.WriteLine("value = dbl1: {0,20}", value.Equals(dbl1))
      TestObjectForEquality(dbl1)
   End Sub

   Private Sub TestObjectForEquality(obj As Object)
      Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
                        value, value.GetType().Name,
                        obj, obj.GetType().Name,
                        value.Equals(obj))
      Console.WriteLine()
   End Sub
End Module
' The example displays the following output:
'       value = byte1:             True
'       112 (Single) = 112 (Byte): False
'
'       value = short1:             True
'       112 (Single) = 112 (Int16): False
'
'       value = int1:               True
'       112 (Single) = 112 (Int32): False
'
'       value = long1:              True
'       112 (Single) = 112 (Int64): False
'
'       value = sbyte1:             True
'       112 (Single) = 112 (SByte): False
'
'       value = ushort1:             True
'       112 (Single) = 112 (UInt16): False
'
'       value = uint1:               True
'       112 (Single) = 112 (UInt32): False
'
'       value = ulong1:              True
'       112 (Single) = 112 (UInt64): False
'
'       value = dec1:                 True
'       112 (Single) = 112 (Decimal): False
'
'       value = dbl1:                False
'       112 (Single) = 112 (Double): False

См. также раздел

Применяется к