オペレーターの過負荷インターフェースに基づくプログラミングC#
-
05-09-2019 - |
質問
背景
を使用していインターフェースに基づくプログラミングは現在のプロジェクトとして作に取り掛かる前にcssプロパティの問題が過負荷運(具体的には、平等や格差にーティシペーションオペレーター.
前提
- 私C#3.0,.純3.5Visual Studio2008
更新は以下のと仮定したFalse!
- 必要なすべての比較の利用等ではなくオペレーター==にはなりません液が通過ご種図書館等の所蔵).
その理由を私は懸念要Equalsを使用するようにオペレーター==であることを見つけられなかったもの。純るガイドラインで記述で使用Equalsではなくオペレーター==以るものです。しかし、再読 ガイドラインをオーバー Equalsおよびオペレーター== 私はこの:
デフォルトでは、演算子==試験のための基準平等により決定するかどうかにつ参考文献を示すのと同じオブジェクトです。そのため、参照型のない実演算子==を高めることができる非常によ可能です。時の型は変更不可能なので、データに含まれるインスタンスの変更はできません、過積載運==値を比較する平等な参考平等ができるので便利で、変更不能なオブジェ、それと同じ長していくと、同じ値を表示します。ないオーバーライドオペレーター==非変更できます。
この Equatableェ
のIEquatableインタフェースを使用する汎用的収集などの辞書リスト、LinkedListの場合は試験のための平等な方法として、IndexOf,LastIndexOf、取り除く。で実施されたanyオブジェクトが格納され一般的です。
Contraints
- 会社の動きをタイムリーなどが鋳物のオブジェからインターフェイスをコンクリートタイプ。
問題
- 時刻の両側にオペレーター==はインターフェースは、オペレーター==過負荷方法の署名からコンクリートの種類に合、このように、デフォルトのオブジェクト演算子==メソッド呼び出されます。
- 時の過負荷オペレーターにクラスは、少なくとも一つのパラメータのバイナリーオペレーターを含有タイプ、そうでない場合はコンパイラエラーが発生する(エラー BC33021 http://msdn.microsoft.com/en-us/library/watt39ff.aspx)
- することはできませんの指定の実装インタフェース
参照コードの出力以下に示す。
質問
方法を提供する適切なオペレータが過負荷には、授業の使用時にインターフェースベース。
参考文献
定義済みの値タイプには、平等のオペレーター(==)の場合にtrueを返しま価値観のオペランドが等しいかどうかを判定します。.参考種類以外の文字列==trueを返す場合、その二つのオペランドが参照が同じオブジェクトです。文字列のタイプ、==値とを比較し、文字列です。
参照
コード
using System;
namespace OperatorOverloadsWithInterfaces
{
public interface IAddress : IEquatable<IAddress>
{
string StreetName { get; set; }
string City { get; set; }
string State { get; set; }
}
public class Address : IAddress
{
private string _streetName;
private string _city;
private string _state;
public Address(string city, string state, string streetName)
{
City = city;
State = state;
StreetName = streetName;
}
#region IAddress Members
public virtual string StreetName
{
get { return _streetName; }
set { _streetName = value; }
}
public virtual string City
{
get { return _city; }
set { _city = value; }
}
public virtual string State
{
get { return _state; }
set { _state = value; }
}
public static bool operator ==(Address lhs, Address rhs)
{
Console.WriteLine("Address operator== overload called.");
// If both sides of the argument are the same instance or null, they are equal
if (Object.ReferenceEquals(lhs, rhs))
{
return true;
}
return lhs.Equals(rhs);
}
public static bool operator !=(Address lhs, Address rhs)
{
return !(lhs == rhs);
}
public override bool Equals(object obj)
{
// Use 'as' rather than a cast to get a null rather an exception
// if the object isn't convertible
Address address = obj as Address;
return this.Equals(address);
}
public override int GetHashCode()
{
string composite = StreetName + City + State;
return composite.GetHashCode();
}
#endregion
#region IEquatable<IAddress> Members
public virtual bool Equals(IAddress other)
{
// Per MSDN documentation, x.Equals(null) should return false
if ((object)other == null)
{
return false;
}
return ((this.City == other.City)
&& (this.State == other.State)
&& (this.StreetName == other.StreetName));
}
#endregion
}
public class Program
{
static void Main(string[] args)
{
IAddress address1 = new Address("seattle", "washington", "Awesome St");
IAddress address2 = new Address("seattle", "washington", "Awesome St");
functionThatComparesAddresses(address1, address2);
Console.Read();
}
public static void functionThatComparesAddresses(IAddress address1, IAddress address2)
{
if (address1 == address2)
{
Console.WriteLine("Equal with the interfaces.");
}
if ((Address)address1 == address2)
{
Console.WriteLine("Equal with Left-hand side cast.");
}
if (address1 == (Address)address2)
{
Console.WriteLine("Equal with Right-hand side cast.");
}
if ((Address)address1 == (Address)address2)
{
Console.WriteLine("Equal with both sides cast.");
}
}
}
}
出力
Address operator== overload called
Equal with both sides cast.
解決
答え:と思いを第二の想定が不十分なものである。 Equals()
する方法、上達するためのコツなどをチェック 意味の平等 のは、二つのオブジェクトが実際には operator ==
.
長い回答:過負荷の解決のためのオペレーター 行コンパイル時には、実行時間.
ない限り、コンパイラで隣はショッピングセンターで、歩い種類のオブジェクトでの適用のオペレータ、コンパイル。以来、コンパイラができないこと IAddress
するものではオーバーライドのための ==
のの定義に該当するデフォルトの operator ==
の実施 System.Object
.
このいただきます際には、お手数でみを定義すること operator +
のための Address
とに加え IAddress
う場合がございます。 ない限り、明示的にキャスト Address
, まず、準備をしている。なぜですか?でコンパイラのないこのことは、特定の IAddress
は Address
, があり、デフォルト operator +
実装面に落ちる System.Object
.
お悔しいためか、この Object
を実装して operator ==
, もは Object
, ので、コンパイラの実現のために解決業務など a == b
すべての種類です。きoverrode ==
, する見込み動作と同じにはなかったことになるためにベストマッチのコンパイラではオリジナルの Object
実装されます。
必要なすべての比較の利用等ではなくオペレーター==にはなりません液が通過ご種図書館等の所蔵).
私は、これこそがまさしています。 Equals()
する方法、上達するためのコツなどをチェック 意味の平等 二つのオブジェクト。 時には意味的な平等の参考資料ですので、実際の平等、その場合、すな変更が必要なものです。その他の場合は、おとえば、オーバーライド Equals
を必要とする場合、強平等の契約上の参照を進めていきます。例えば、もたらすために二 Persons
等しい場合は、同じ社会保障番号、または両 Vehicles
等しい場合は、同じ電圧が出力されます。
が Equals()
や operator ==
は同じものではありません。必要なときにいつでもをオーバーライド operator ==
, するオーバーライド Equals()
, がほとんどないました。 operator ==
は文法が便利です。一部のCLRの言語(例えば視覚Basic.NETになりたい方も可能にするためにオーバーライドは、同等演算子です。
他のヒント
また、同じ問題については、ソリューション:簡単に、ios、androidとmac用にc#のカスタムパターン
して設定すべてのユーザーの利用世界共通のパターンのカタログのほか、独自の入SVNできるように収録および更新されます。
カタログに含まれるすべてのパターンに間違ったシステム:
$i1$ == $i2$
(i1、i2いて 表現 当社のインタフェースの種類、または導出される。
に置き換えパターン
$i1$.Equals($i2$)
の厳しさはショーとしてエラー.
同様にして $i1$ != $i2$
武器agiは、dexで下がらないboxerぐ.P.S.グローバルカタログを簡単に、ios、androidとmac用にc#6.1(EAP)は、どの最終開始できる予定です。
更新:さん、 簡単に、Ios、AndroidとMac用にC#の問題 マべてのインタフェース'=='警告いないとの比較をnullにします。ご投票さんでいます。
Update2:簡単に、ios、androidとmac用にc#または[CannotApplyEqualityOperator]属性には助けることができる。