2017-08-17 8 views
1

を定義する型の別名を、私はこのコードを書いた使い方:(自分を繰り返してはいけない)DRYで狂信的な信者として型の別名

Imports SimpleDict = System.Collections.Generic.Dictionary(Of String, String) 
Imports ListOfSimpleDicts = System.Collections.Generic.List(Of SimpleDict) 
Imports DictOfSimpleDicts = System.Collections.Generic.Dictionary(Of String, SimpleDict) 

私はすぐにエラー、「タイプを得る 『がSimpleDict』が定義されていません"最後の2行に私のタイプエイリアスで自分自身を繰り返すことを避ける方法はありませんか?

[補足] 24時間後、SimpleDictを別名Dictionary(Of String、HashSet)に変更する必要がありました。私はエイリアスを使用しているので、私の変更は私が使用したどこにでも伝播しますが、残念ながら残りの2行を自分で変更する必要があります。

+1

文字列型の辞書を直接インポートすることはできません。最初に名前空間をエイリアスにインポートし、辞書の変数を定義する必要があります。 Imports SimpleDict = System.Colections.Generic dim newDictとして新しい辞書(文字列、文字列) –

+0

変数を宣言していません。ここで説明するように、型のエイリアスを定義しています。https://docs.microsoft。 com/ja-jp/dotnet/visual-basic/language-reference/statements/imports-statement-net-namespace-and-typeを参照してください。 – samwyse

答えて

1

From the VB specification

Importsステートメントは、ソースファイルに名前を利用できるように、しかし はグローバル名前空間の宣言空間に何かを宣言していません。 Importsステートメントによってインポートされる名前の スコープは、ソースファイルに含まれる 名前空間メンバ宣言を超えて拡張されます。 Importsステートメントのスコープ には、他のインポートの ステートメントは含まれておらず、他のソースファイルも含まれていません。 インポートステートメント は互いに参照しないことがあります。この例では

それが最初のインポート 別名によって影響を受けないため、最後のImportsステートメントはエラーです。

Imports R1 = N1 ' OK. 
Imports R2 = N1.N2 ' OK. 
Imports R3 = R1.N2 ' Error: Can't refer to R1. 

私はあなたの代わりに何ができるかわかりません。私が考えることができるのは、SimpleDictをクラスSystem.Collections.Generic.Dictionary(Of String, String)として定義することだけです。クラスを作成する必要があるため、これが理想的かどうかはわかりません。

Imports ListOfSimpleDicts = System.Collections.Generic.List(Of RootNamespace.SimpleDict) 
Imports DictOfSimpleDicts = System.Collections.Generic.Dictionary(Of String, RootNamespace.SimpleDict) 

Public Class SimpleDict 
    Inherits System.Collections.Generic.Dictionary(Of String, String) 
End Class 
+0

私はあなたのアプローチが好きです。私が思いつくことができるものよりも優れています。私はそれと一緒に遊んで、それがどのように動作するかを見ていきます。私はメソッドにすることができるいくつかのユーティリティ関数を持って、これでうまくいくでしょう。 – samwyse

関連する問題