簡體   English   中英

當值相同但類型不同時比較兩個變量(例如Int16,Int32,Int64)

[英]Comparing two variables when the value is the same but the type is different (e.g. Int16, Int32, Int64)

我需要比較兩個變量,以確定它們是否相同。 這些變量被轉換為“對象”,可以分配任何.NET類型。

我遇到的問題是它們是否都是數字。 在它們具有相同值(例如它們都是-1)但具有不同類型(例如,一個是Int32,另一個是Int64)的情況下,然后object.Equals返回false。

是否有一種比較通用的方法來比較忽略變量類型的值,只看數值?

假設類型是盒裝整數,所以你不能簡單地==它們,你可能想使用Convert.ToInt64將所有值轉換為long,然后使用==進行比較。 如果你想支持UInt64,你需要額外的邏輯。

只需使用通常的運算符,如==<等.Int16將自動轉換為Int32,因為沒有信息丟失。 Int *是值類型,因此值會自動進行比較。

我能夠使用System.IConvertible接口來解決值類型的這個問題:

object expectedValue = (int) 42;
object testValue = (long) 42;

// This handles equal values stored as different types, such as int vs. long.
if (testValue is IConvertible testValueConvertible
    && expectedValue is IConvertible)
{
    testValue = testValueConvertible
        .ToType(expectedValue.GetType(),
                System.Globalization.CultureInfo.InvariantCulture);
}

if (object.Equals(testValue, expectedValue))
    Console.WriteLine("Values are equal");
else
    Console.WriteLine("Values are NOT equal");

我創建了這個.NET Fiddle作為演示: https//dotnetfiddle.net/GSUjIS

假設您有一個帶有兩個object參數的方法,您可以創建一個帶有兩個long參數的重載。 我相信(盡管我還沒有驗證)傳遞2個int會選擇longs的重載,而不是對象。

另一個有點hackish選項是在兩者上調用ToString()並比較字符串。 這只有在它們都是整數類型(即沒有doubledecimal )時才有效,因此您需要事先檢查類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM