2016-06-30 10 views
0

私のクラスのプロパティに検証属性を追加しています。私は図書館を持っています。第三者の図書館にはStringLengthAttributeが含まれています。 System.ComponentModel.DataAnnotationsの下に同じ名前の属性があることがわかりました。
私が作成しているクラスでサードパーティとSystem.ComponentModel.DataAnnotationsの両方を使用しています。それはStringLengthAttributeにあいまいさを引き起こします。コンパイラは、のような属性に@を使用するように提案しました。それは私がしたことですが、F12(定義に移動)しようとすると、それが私を第三者図書館に連れて来ました。あいまいさを解決する属性の前に@記号を理解する必要があります

私は属性で@記号が実際にどのように動作するかを理解したいと私はサードパーティとDataAnnotationの両方の名前空間を使用して宣言されていることを考えることをやるべきか、第三者ではなくSystem.ComponentModel.DataAnnotation.StringLengthAttributeを使用したいですクラスの上の部分。

[@StringLength(10)] 
public string Name { get; set; } 
+0

:ここ

はおそらく私がやったよりも、この優れたを説明するC#言語仕様からの例です。 @wablabは何をしますか?そのように動作しないときに何かがどのように動作するかを尋ねているので、可能な答えはありません。問題の唯一の解決策は、属性に完全修飾名前空間を使用することです。 –

答えて

2

C#が属性を持つメンバーを飾るとき、あなたは言葉Attributeを省略することができますいくつかのシンタックスシュガーを提供しています。あなたはMyCustomAttributeという名前の属性を持っている場合、それをメソッドに適用するときにたとえば、あなたがこの速記を使用することができます。あなたもまたAttributeから派生した「MyCustom」という名前のクラスを宣言するまで

[MyCustom] 
public void MyMethod() 
{ 
    ... 
} 

これは、素晴らしいです。このような場合、C#コンパイラは[MyCustom]がクラスを参照するのか、MyCustomAttributeクラスを参照するのかを知りません。属性の使用に接頭語「@」を付けると、コンパイラに、@に続く名前を正確に使用することを意味することになります(つまり、コンパイラは「属性」を追加しないでください)。従って[@MyCustom]MyCustomクラスを指し、一方[@MyCustomAttribute]MyCustomAttributeクラスを指す。

[@StringLength(10)]の使用例では、コンパイラはその属性をStringLengthAttributeというクラスではなく、StringLengthというクラスに解決します。それはあなたがそれがないと思う何をしません

[AttributeUsage(AttributeTargets.All)] 
public class X : Attribute 
{} 

[AttributeUsage(AttributeTargets.All)] 
public class XAttribute : Attribute 
{} 

[X]     // Error: ambiguity 
class Class1 {} 

[XAttribute]   // Refers to XAttribute 
class Class2 {} 

[@X]     // Refers to X 
class Class3 {} 

[@XAttribute]   // Refers to XAttribute 
class Class4 {} 
+0

私の場合、属性はどちらもStringLengthAttributeと同じ名前です。私はDataAnnotationのものではなく、第三者を指していることをどのように知っていましたか?ところで、私はいつも使用する属性を明確に述べるために完全修飾名をつけることができます。私はこの構文的な砂糖を理解したい。 – Lance

+0

'StringLengthAttribute'を適用したファイルが、' using System.ComponentModel.DataAnnotations; 'ではなく、サードパーティクラスを含む名前空間に 'using'ステートメントを持っていれば、それはコンパイラがどのように選択することができます。 'using'ステートメントが両方のクラスに存在する場合、おそらくサードパーティのバージョンは孤立したパラメータとして' int'を受け入れるコンストラクタを持つ唯一のバージョンです(私はコンパイルエラーを引き起こすことを期待していました) 。両方のクラスにこのタイプのオーバーロードを持つコンストラクタがある場合、どのように動作しているのかわかりません。 – wablab

関連する問題